v0.2.15 — LoRA triggers + Tags B + Structure label
Big one: LoRA trigger word prepend (fixes "LoRAs feel weaker in TD")
Every LoRA carries a metadata.primary_trigger_word — the activation token it was trained against. TD was passing the user's prompt through verbatim, so enabling a LoRA loaded it server-side but the encoder never saw the activation token; the style barely affected output. The canonical web client injects the trigger prefix at WS send time; TD now does the same.
- New
src/lora_triggers.py— pure-Python port of the canonicalloraTriggers.ts. _apply_lora_catalogcapturesmetadata.primary_trigger_wordinto the catalog Table DAT + in-memory dict.SendPromptprepends the prefix to bothtagsandtags_b, stripping any stale leading triggers first.- New Auto-Prepend LoRA Triggers toggle on the Prompt+LoRA page (default On).
enable_lora/disable_loranow also re-push the prompt so the encoder picks up the new trigger immediately. Before this, toggling a LoRA loaded it server-side but you had to also touch a strength slider or pulse Sendprompt to make it audibly fire.
Tags B / Prompt blending now actually blends
Promptblend was streaming a value but blending nothing because the second prompt was empty mid-session. New Promptb Str param on the Prompt+LoRA page next to Prompt, editable any time. SendPrompt passes it as tags_b. _build_session_config reads prompt_b from the live Promptb — one source of truth. Deleted the obsolete Initpromptb.
Synthesis page: "Structure" (the canonical's label)
hint_strength is the model's structure control — it governs how closely the model follows the source's section / rhythm / dynamics. The canonical labels it "Structure"; TD was labeling it "Hint Strength". Wire key unchanged; only the user-facing label and tooltip. Also corrected: Denoise → "Strength", DCW Scaler → "DCW low", DCW High Scaler → "DCW high" — all surfaced by the new drift checker's label-parity check.
Drift checker hardening — would have caught all of the above
Four new checks in scripts/check_protocol_drift.py:
ui_coverage— every pulse inDISCRETE_PULSE_TO_KINDmust have a non-hidden Param.label_parity— TD Param labels must contain the canonical'sDISPLAY_NAMESword for shared wire keys.lora_trigger_injection— verifies the three integration points stay wired.tags_b_plumbing— if SessionConfig sendsprompt_b, anencode_promptcall site must passtags_b=.
Each verified by regression-testing.
Other fixes
- UI lag fix:
_apply_lora_catalog's signature no longer includestrigger_word, so server catalog echoes with intermittent metadata don't force a full Table DAT + dynamic-par rebuild on every event. - "DAT did not load from … overwrite anyway?" dialog on import: code DATs no longer bake the developer's absolute
src/path into the exported .tox. Embeddeddat.textis the only source.
Known cosmetic mismatch
The shipped .tox carries BUILD_MARKER = v0.2.15-...-lora-resend (boot textport) but DEMON_TD_VERSION = 0.2.14 (User-Agent on cloud REST calls). TD's bidirectional DAT sync wrote version.py back to disk between the version bump and the rebuild. Functionally identical to v0.2.15 in every other respect; root cause (syncfile=True baked into the previous build's DATs) is fixed in this release for everyone running v0.2.16+.
Files
demonTD-v0.2.15.zip—.tox+vendor/bundle. Drop this. Keepvendor/next to the.tox.demonTD.tox— the operator only. Useful when you already have a matchingvendor/.
Stats
105 unit tests pass (24 new). Drift checker clean against origin/main.