Agent Sona Learning Optimizer
ruvnet/ruflo
Agent skill for sona-learning-optimizer - invoke with $agent-sona-learning-optimizer
Explains how HOT-Step's LoRA/LoKr adapter system loads, merges, caches, stacks, and regionally masks adapters at runtime, including hard-won failure modes.
$ npx skills add scragnog/HOT-Step-CPP --skill adapter-system -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install scragnog/HOT-Step-CPP adapter-system --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/adapter-system .claude/skills/adapter-system && 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 "adapter-system" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/adapter-system into .claude/skills/adapter-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "adapter-system", 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/adapter-systemType 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 adapter-system -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install scragnog/HOT-Step-CPP adapter-system --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/adapter-system .agents/skills/adapter-system && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "adapter-system" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/adapter-system into .agents/skills/adapter-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "adapter-system", 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 adapter-system -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install scragnog/HOT-Step-CPP adapter-system --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/adapter-system .cursor/skills/adapter-system && 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 "adapter-system" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/adapter-system into .cursor/skills/adapter-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "adapter-system", 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/adapter-system--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 adapter-system -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install scragnog/HOT-Step-CPP adapter-system --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/adapter-system .gemini/skills/adapter-system && 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 "adapter-system" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/adapter-system into .gemini/skills/adapter-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "adapter-system", 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 adapter-systemInstalls 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 adapter-system -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/adapter-system .github/skills/adapter-system && 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 "adapter-system" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/adapter-system into .github/skills/adapter-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "adapter-system", 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 adapter-system -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 adapter-system --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/adapter-system .opencode/skills/adapter-system && 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 "adapter-system" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/adapter-system into .opencode/skills/adapter-system/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "adapter-system", 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.
adapter-systemExplains how HOT-Step's LoRA/LoKr adapter system loads, merges, caches, stacks, and regionally masks adapters at runtime, including hard-won failure modes.
Adapter System is an agent skill from scragnog/HOT-Step-CPP. Explains how HOT-Step's LoRA/LoKr adapter system loads, merges, caches, stacks, and regionally masks adapters at runtime, including hard-won failure modes. Use when working on adapter loading/merging, multi-adapter stacking, per-section adapter masking, adapter cache keys, cross-base adapter conversion, debugging adapters that sound wrong or silent, or when UI adapter knobs (Adapter VRAM, Alignment Timing, Sum/Blend, trigger words, [Section]{k=v} lyric directives) appear dead or ignored.
Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `reference.md`).
It sits in AI & LLM Engineering, covering Fine-tuning. 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.
10 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:
cmakenpxnpmgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, npm and git, 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.
Adapter System loads about 6.3k tokens when it runs. Until then it costs about 127 tokens; SKILL.md has 2,946 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 found no risky patterns in SKILL.md.
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,946 words, ~6,254 tokens.
.claude/skills/adapter-system/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.The deepest institutional-knowledge subsystem in HOT-Step CPP. Every rule below was paid for with a shipped bug or a failed research direction. Deeper detail (merge/runtime internals, cache-key construction, cross-arch research history) lives in reference.md in this folder.
engine/src/dit.h / dit-graph.h.B@A is a delta added to a base weight. LoKr — LyCORIS Kronecker-product variant (.lokr_w1/.lokr_w2 tensors). DoRA — adds a per-row multiplicative rescale; two on-disk namings, both supported in MERGE MODE ONLY: LyCORIS dora_scale (LoKr path) and PEFT lora_magnitude_vector (LoRA path, since 2026-07-19). With DoRA the delta carries only alpha/rank; user strength × group scale blends the decompose factor (s = u·(m/‖W+Δ‖) + (1−u)), so strength 0 does NOT fully disable a DoRA adapter.W_adapted = W_base + scale·Δ.adapter-merge.h). Runtime mode — deltas live as separate GPU tensors, applied each sampling step as y = W@x + Δ@x (adapter-runtime.h + dit-graph.h).AceRequest) the Node server sends to the C++ engine's /synth endpoint.AceRequest (struct ServerFields, engine/tools/hot-step-server.cpp:569) and stores in the global g_hotstep_params (engine/src/hot-step-params.h:205).model-store.{h,cpp}. Two requests with the same key reuse the same loaded (adapter-merged) model.base ← base + β·(S − base) (see Institutional knowledge).engine/src/adapter-*.h, the adapter parts of dit.h, dit-graph.h, hot-step-sampler.h, or hot-step-server.cpp.[Header]{k=v} lyric directives, adapter VRAM quantization, or trigger words.engine/src/hot-step-sampler.h:605, :659, :716, :940, :1097. Any NEW graph input must join every one of those sites. (Commits a6db135, 2052bc3.)168dcb5 — the law). Every input that changes the merged weights or loaded deltas MUST be part of ModelKey, and a failed adapter load must NEVER be cached as a success. Key construction: engine/src/pipeline-synth.cpp:168-199; hash/eq: engine/src/model-store.cpp:48-94; failure path: engine/src/dit.h:648-658. If you add any parameter that affects merged/loaded weights, add it to the key AND the hash AND the equality — all three.engine/src/dit.h:565-586; runtime: adapter_runtime_rebase in adapter-runtime.h, invoked after the first adapter stages). Applying it per adapter resets the running base on every merge (at β=1 only the last adapter survives) — in runtime mode it would duplicate the base correction N×. Works in BOTH modes since 7aac3c2 (runtime folds β·(S−T) into the staged delta sum — matmul distributivity makes it output-identical to merge). NOT supported on the per-section masking path (masked per-frame deltas can't carry an always-on base correction; engine warns + skips, and the cache key mirrors that skip in pipeline-synth.cpp).0f3bf6d, reverted in ee041e1: penalising cross-section self-attn logits broke musical continuity (multi-second silence gaps, degenerate later sections). Self-attention carries BOTH adapter identity AND musical coherence — you cannot suppress one without the other. The adapter_section_isolation param is still plumbed end-to-end but dormant (engine ignores it). See reference.md §Reverted for the structurally safer untried alternative."q4_k" string is now aliased to Q4_0 (engine/src/adapter-runtime.h:136-141). Q4_0/Q8_0 require ne0 % 32 == 0; anything else falls back to BF16.mul_mat dequantizes transparently, but any code that reads delta bytes directly assuming BF16 crashes (a delta-L2 diagnostic did exactly this — removed in 46603bf).adapter_runtime_quant, adapter_section_align_at, rebase_*, …) do NOT survive the engine /lm round trip. server/src/routes/generate.ts rebuilds synth requests as {...aceReq, ...LM-generated-fields-only} (lines 238 and 320). A field whitelist here once made the Adapter VRAM and Alignment Timing knobs silently dead on the default path (fixed in 8ea519b/168dcb5).engine/tools/hot-step-server.cpp — engine/tools/ace-server.cpp is upstream reference code, not compiled. The live sampler is engine/src/hot-step-sampler.h — dit-sampler.h is dead upstream code. pipeline-synth-ops.cpp:9 includes hot-step-sampler.h; losing that include on an upstream sync is silent (compiles, all solvers/schedulers/guidance go dead). After any sync run engine/verify-hooks.ps1..\dev-rebuild.bat from repo root, immediately — NEVER engine/build.cmd directly (you cannot reliably tell whether the app is running; Node auto-respawns ace-server → infinite respawn + file-lock loop), never cmake --clean-first (20+ min CUDA recompile). TypeScript changes: npx tsc --noEmit, not npm run build. Git: stage explicit paths only — never git add -A or add -f (re-adds gitignored models/checkpoints/local docs); commit locally often; push only with explicit user approval.server/src/services/generation/translateParams.ts:83-143 maps params.loraStack → req.adapters [{name, scale}] (supersedes the single req.adapter), plus adapter_mode, adapter_runtime_quant, per-group scales, basin re-base fields (through :128), and trigger words for all stacked adapters (:131-143). Per-section directives in lyrics are parsed here (see below)./synth: the engine parses the JSON twice — once as AceRequest (engine/src/request.{h,cpp}), once as the ServerFields sideband (hot-step-server.cpp:569+).hot-step-server.cpp:1079). Fills g_hotstep_params.adapters and all sideband fields BEFORE ace_synth_load — the merge reads them during load (hot-step-server.cpp:1129 comment).pipeline-synth.cpp:168-199 builds the DiT ModelKey; model-store returns the cached DiT or loads via dit_ggml_load.dit.h): merge mode → sequential adapter_merge per stacked adapter (deltas accumulate: W ← W + s1·Δ1 + s2·Δ2 + …); runtime mode → skip QKV/gate_up fusion (dit.h:420 — runtime deltas need individual projections), then after GPU alloc load runtime deltas (dit.h:608+).hot-step-sampler.h): deltas applied per step; section masks (if active) built and re-uploaded every step.Different adapters active in different song sections, driven by lyric directives like
[Chorus]{albumB2=1; albumN=0} (keys = adapter filename stem, or positional #2/2, 1-based).
translateParams.ts:104). Forces adapter_mode=runtime (server :114; engine double-checks, hot-step-server.cpp:1157-1159). When the gate is unmet, directives are still stripped from lyrics (stripAdapterDirectives) so they never reach the LM/encoder as garbage tokens. The UI stack controls sit behind Advanced mode (advancedAdapters in ui/src/stores/globalParamsStore.ts).server/src/services/generation/adapterSections.ts): Sum/Blend applied per section (blend budget default 0.75); directive-less sections use stack default scales; {…} with no key=val pair is treated as lyric text and left alone; all-typo keys warn and fall back to defaults; weights clamp ≥ 0.dit.h:618-640): each adapter goes into its OWN DiTLoRA in m->loras[], UNIT-scaled (1.0) — the per-frame mask carries the effective scale; loading with the stack scale would double-scale (dit.h:628-631). This costs N× VRAM vs the summed path, hence Q4_0 delta quantization (~¼ size).dit-graph.h): one [1,S,1] F32 mask tensor per adapter, shared across layers. Frame-indexed projections get Σᵢ (Δᵢ@x) ⊙ maskᵢ; token/global projections (cross-attn k/v, cond_embed) get the adapter's scalar mean section weight instead — a frame mask is the wrong axis there (dit-graph.h:430-433). Known limitation: text conditioning is therefore a constant blend across the song.hot-step-sampler.h): P1 builds an initial frame→section map proportional to section character counts (:306-323), with a ~0.5 s triangular crossfade between sections (ce57675). P2: at adapter_section_align_at fraction of steps (default 0.55, UI "Alignment Timing"), estimate x0, run alignment extraction on a private scheduler, map frames → dominant lyric token → section via the header-anchored token map (pipeline-synth-ops.cpp:1419-1495), median-smooth, rebuild masks (:338-385). Falls back to the P1 map on failure.Per-adapter gain curves g(t) over flow-matching t (1=noise → 0=clean): each stacked
adapter's per-frame mask is multiplied by its interpolated g(t) at EVERY model
evaluation (upload_lora_masks(t_val) in hot-step-sampler.h — the single helper
that replaced all five raw mask-upload sites). Different adapters can own different
slices of the trajectory ("structure" expert early / "timbre" expert late — TD-LoRA
/ TimeStep Master scalar mixing). Key facts:
translateParams.ts
(+ forced runtime mode); allowed at stack size 1 (gates in dit.h and
hot-step-server.cpp accept >=2 adapters OR gains active). Composes with real
per-section directives (mask × gain).|sect marker still applies via the synthetic section). Do not "fix" this
by adding them to the key.upload_lora_masks runs on EVERY
evaluation regardless (!dit_graph.direct || lora_gains_active). Host masks stay
UNSCALED — scaling happens into a scratch buffer at upload so P2 rebuilds and
repeated evals never compound gains.adapters[].gain_curve = uniform samples of g(x) over [0,1]
(33 from the UI) + gain_domain: "steps" (x = remaining-steps fraction,
engine maps each eval's t to its nearest schedule index) or "t" (x = raw
flow-matching t). UI windows are ALWAYS "steps"; trained-expert / router
curves must be "t" (must match the training axis). This split exists because
shifted schedules are wildly nonuniform in t — shift-3 @ 20 steps spends 17
steps above t=0.5, so a t-domain "0–50%" window starved the late adapter to 3
tail steps ("all I hear is the first adapter"). Window edges are smoothstep
ramps CENTERED on the bound so adjacent windows crossfade summing to 1. Every
[DiT] Step log line appends gains=[..] when gating is active — check
there first when a mix sounds one-sided.--timestep-window-min/max (rejection-resampled
logit-normal; discrete mode filters the 8-step schedule) trains matching
interval experts. T-LoRA: the high-noise expert overfits fastest — lower rank.runtime_lowrank is CLOBBERED to plain runtime
(server + engine) — windows currently require the full-delta path; masked
low-rank apply is untried future work.getGlobalParams() gated adapterRuntimeQuant on the
selected mode — a Merge-mode user with windows got full BF16 deltas
(~8 GB/adapter on XL, 32 GB with 2 + reload churn) and their Merge-VRAM "Low"
setting meant nothing. Quant now flows (and the Adapter VRAM knob shows)
whenever windows are active. Any future knob that matters on a forced
path must gate on the EFFECTIVE mode, not the selected one.backend_sched_new; sharing dit->sched corrupts CUDA state → CUDA error: invalid argument (4e48176).dit-graph.h:590 (graph_cap = 8192 + loras*4096) and dit.h:328-331 (sched_nodes = 8192 + adapters*4096, sized from the intended stack because m->loras isn't populated yet). Miss either → crash with N section adapters (e09d6a3).HOTSTEP_SECTION_NOMASK debug mode, mask tensors must not be created at all — unconsumed graph inputs get no buffer, so uploading to them crashes (34dce60).| Path | Role |
|---|---|
engine/src/adapter-merge.h | Merge mode: safetensors/PEFT/LyCORIS parsing, LoKr detection (:440), GPU merge graph (adapter_merge_on_backend :523, contains the DoRA weight-decompose for both GPU and host paths), delta compute (adapter_compute_delta :480), basin re-base (adapter_rebase_fetch :78), PEFT DoRA magnitude detection (lora_is_magnitude :183), per-module alpha_pattern parser (adapter_read_alpha_pattern :238 — REQUIRED for PEFT rank_pattern adapters, else per-module strength is alpha_global/rank_actual ≈ wildly wrong), entry adapter_merge (:1453) |
engine/src/adapter-runtime.h | Runtime mode: DiTLoRA* structs (:39-70), slot map dit_lora_slot (:105), stack delta-sum adapter_stage_delta (:173), quantized finalize (:804), adapter_load_runtime_stack (:1011), DoRA merge-only warnings (PEFT :299, LoKr :510) |
engine/src/adapter-cancel.h | g_adapter_cancel atomic + adapter_cancel_requested() — cooperative cancel of the ~17 s delta precompute; separate header so the server avoids ggml deps |
engine/src/adapter-trt.h | TensorRT IRefitter merge variant (#ifdef HOT_STEP_TRT) |
engine/src/dit.h | Load orchestration: merge-vs-runtime, fusion skip (:420), once-per-stack re-base (:565), per-section per-adapter loads (:618), fail-don't-cache (:648). Fork hook: includes adapter-merge.h/adapter-runtime.h (:11/:13) |
engine/src/dit-graph.h | Forward graph: dit_ggml_linear_lora (:45), DiTLoRASectionCtx (:80), per-adapter masks, NOMASK debug flag (:90) |
engine/src/hot-step-sampler.h | Live sampling loop: mask building/rebuilding, per-step re-uploads, P2 alignment |
engine/src/hot-step-params.h | g_hotstep_params sideband global (:205) + hotstep_adapter_stack_sig (:211); included by model-store.h (fork hook) |
engine/src/model-store.{h,cpp} | ModelKey adapter fields (model-store.h:90-102), hash/eq (model-store.cpp:48-94) |
engine/src/pipeline-synth.cpp | Builds the DiT cache key (:168-199) |
engine/src/pipeline-synth-ops.cpp | Header-anchored token→section map for P2 (:1419-1495); carries the hot-step-sampler.h fork hook (:9) |
engine/tools/hot-step-server.cpp | The REAL ace-server. ServerFields (:569), name→path resolution + g_hotstep_params fill (:1060-1162), cancel wiring (~:1214), job phase ADAPTER_PRECOMPUTE (:263) |
server/src/services/generation/adapterSections.ts | [Section]{k=v} directive parser + stripAdapterDirectives |
server/src/services/generation/translateParams.ts | UI params → aceReq adapter fields (:83-143) |
server/src/routes/generate.ts | LM-echo rebuild {...aceReq, ...lmFields} (:238, :320) |
server/src/routes/adapters.ts | Filesystem only: GET /api/adapters/browse, POST /api/adapters/scan (.safetensors listing) |
ui/src/stores/globalParamsStore.ts, ui/src/components/global-bar/AdaptersDropdown.tsx | Adapter stack, Sum/Blend, Adapter VRAM, Alignment Timing UI |
| Symptom | Cause → fix |
|---|---|
| Adapters silently inaudible in per-section mode; mask logs show ~0 | Mask/input re-upload missing for steps 2..N or after a graph rebuild — Golden rule 1 |
| Base-model output despite adapter selected, only after an earlier failed load | Load failure cached as success under the adapter-bearing key — check dit.h:648 path (fixed 168dcb5) |
| Wrong adapter flavor after toggling merge↔runtime or changing quant/scale/group scales | Missing cache-key component — audit pipeline-synth.cpp:168-199 + model-store.cpp hash AND eq |
CUDA error: invalid argument at the alignment step | Alignment shared the main scheduler — must be private (4e48176) |
| Crash/overflow when loading N section adapters | Node budget / sched hash-set not scaled with adapter count (dit-graph.h:590, dit.h:328) |
| Load stalls minutes at "quantize" | Real Q4_K requested — use Q4_0 (Golden rule 6) |
| Crash reading delta tensor bytes in diagnostics | Assumed BF16; deltas may be Q4_0/Q8_0 (Golden rule 7) |
| Silence gaps between sections, later sections degenerate | Someone re-enabled self-attn isolation — REVERTED, Golden rule 4 |
| Adapter VRAM / Alignment Timing knobs "do nothing" | A ServerFields param dropped in an LM round-trip whitelist — Golden rule 8 |
| Merge stack with re-base outputs only the LAST adapter | Re-base applied per adapter instead of once per stack (dit.h:565) |
| Section adapters roughly twice as strong as expected | Section deltas loaded with stack scale instead of unit scale (dit.h:628) |
| DoRA adapter sounds wrong in runtime mode | DoRA is merge-only; runtime can't express the multiplicative rescale — engine warns and applies plain LoRA (adapter-runtime.h:299 PEFT, :510 LoKr) |
PEFT adapter with per-module ranks (rank_pattern in adapter_config.json) sounds weak/distorted | alpha_pattern must be parsed per module (adapter_read_alpha_pattern) — the global lora_alpha over the actual per-tensor rank gives e.g. 128/512 instead of the trained 1024/512. Also requires adapter_config.json to sit NEXT TO the .safetensors (alpha fallback is rank ⇒ wrong strength without it) |
| All solvers/schedulers/guidance dead after an upstream sync (compiles fine) | pipeline-synth-ops.cpp lost the hot-step-sampler.h include — run engine/verify-hooks.ps1 |
adapter-merge.h:78, applied in dit.h:578 for merge; adapter_runtime_rebase in adapter-runtime.h for runtime) — user-validated by ear in merge mode, 2026-07-14 ("works fantastically"); the runtime-mode port (7aac3c2, same day) is mathematically output-identical but awaits its own by-ear A/B. Never assume weight similarity implies adapter transferability.g_hotstep_params.adapters) with read-from-pending merge accumulation (merge mode sources each tensor's current post-prior-merge value) and delta-sum in runtime mode (adapter_stage_delta — per-step cost and VRAM flat regardless of stack depth on the non-section path). CRITICAL: basin re-base once per stack, not per adapter (Golden rule 3).0f3bf6d → reverted ee041e1. Do not re-attempt without a new design for cross-section coherence (Golden rule 4; safer untried idea in reference.md).168dcb5). Golden rule 2. The specific historical gaps were the time_embed/proj_in group scales and the runtime-mode marker; the failure-caching bug installed adapter-less models under adapter-bearing keys.HOTSTEP_BCAST_TEST=1 then run engine\build\Release\ace-synth.exe — numeric self-test of mask broadcast ops on the real backend, no models needed (engine/tools/ace-synth.cpp:160).HOTSTEP_SECTION_NOMASK=1 — apply section deltas unmasked (dit-graph.h:90). Adapters audible ⇒ mask values are the problem; still silent ⇒ wiring/upload is the problem.logs\<session>\ace_engine.log or logs\<session>\generations\gen_*.log. Useful greps: [Adapter-RT] Loaded, [Adapter-RT] P2:, header-anchored, [Adapter] Basin re-base, Per-section masking.docs/plans/per-section-adapter-masking.md, docs/plans/cross-arch-adapter-conversion.md, docs/plans/multi-adapter-runtime-switching-handoff.md, docs/plans/2026-04-18-adapter-group-scales-investigation.md — local-only, gitignored; may be absent on a fresh clone. Their load-bearing content is distilled into this skill and reference.md.engine/docs/ARCHITECTURE.md — engine-wide context (committed).© scragnog, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .claude/skills/adapter-system of scragnog/HOT-Step-CPP.
Open the folder on GitHubat commit 91e92a8
Adapter System 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 |
|---|---|---|---|---|---|---|
| Adapter System this skillscragnog/HOT-Step-CPP | 173 | — | ~6.3k | Automated safety check: Pass | MIT | |
| Agent Sona Learning Optimizerruvnet/ruflo | 74k | 2 repos | ~516 | Automated safety check: Pass | MIT | |
| Sentence-Transformers Training Routerhuggingface/skills | 11k | 1 repos | ~2.6k | Automated safety check: Pass | Apache-2.0 | |
| Train RlOpenPipe/ART | 11k | — | ~2.4k | Automated safety check: Pass | Apache-2.0 | |
| Qwopus27b Rl TrainingR6410418/Jackrong-llm-finetuning-guide | 1.7k | — | ~830 | Automated safety check: Pass | Apache-2.0 | |
| Dataset Evaluationawslabs/agent-plugins | 915 | 1 repos | ~1.3k | Automated safety check: Pass | Apache-2.0 |
ruvnet/ruflo
Agent skill for sona-learning-optimizer - invoke with $agent-sona-learning-optimizer
huggingface/skills
Routes a sentence-transformers training task to the right model type and required reference docs and example scripts, covering bi-encoders, rerankers, sparse and multi-vector models.
OpenPipe/ART
RL training reference for the ART framework. An agent skill from OpenPipe/ART.
R6410418/Jackrong-llm-finetuning-guide
Prepare, validate, launch-plan, monitor, resume, and stop configurable Qwopus 27B reinforcement-learning workflows for GRPO or GSPO.
awslabs/agent-plugins
Validates dataset formatting and quality for SageMaker model fine-tuning (SFT, DPO, or RLVR).
OpenPipe/ART
SFT training reference for the ART framework. An agent skill from OpenPipe/ART.
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
Explains how HOT-Step's LoRA/LoKr adapter system loads, merges, caches, stacks, and regionally masks adapters at runtime, including hard-won failure modes. Adapter System is an agent skill from scragnog/HOT-Step-CPP. Explains how HOT-Step's LoRA/LoKr adapter system loads, merges, caches, stacks, and regionally masks adapters at runtime, including hard-won failure modes.
Adapter System fits situations like: working on adapter loading/merging; multi-adapter stacking; per-section adapter masking; adapter cache keys.
Run `npx skills add scragnog/HOT-Step-CPP --skill adapter-system -a claude-code`. Or copy the skill folder (.claude/skills/adapter-system in scragnog/HOT-Step-CPP) into .claude/skills/adapter-system in your project. Claude Code loads it when a task matches its description.
Run `npx skills add scragnog/HOT-Step-CPP --skill adapter-system -a codex`. Or copy the skill folder (.claude/skills/adapter-system in scragnog/HOT-Step-CPP) into .agents/skills/adapter-system 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 adapter-system -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/adapter-system, .gemini/skills/adapter-system, .github/skills/adapter-system and .opencode/skills/adapter-system in your project.
Going by SKILL.md and its folder, Adapter System needs the command-line tools its instructions call (cmake, npx, npm and git). Our summary lists: Node.js.
SKILL.md contains no URLs. Its commands use npx, npm and git, 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 no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Adapter System 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.3k tokens (SKILL.md is roughly 25k 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 Adapter System: Agent Sona Learning Optimizer (ruvnet/ruflo, 74k stars), Sentence-Transformers Training Router (huggingface/skills, 11k stars), Train Rl (OpenPipe/ART, 11k stars) and Qwopus27b Rl Training (R6410418/Jackrong-llm-finetuning-guide, 1.7k 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 173 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.