Onboarding's 姿 step offers dead persona bundles instead of Live2D models #52
Labels
No labels
needs-info
needs-triage
ready-for-agent
ready-for-human
v2
wayfinder:grilling
wayfinder:map
wayfinder:prototype
wayfinder:research
wayfinder:task
wayfinder:ticket
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
aiko/denpa#52
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Onboarding's 姿 step offers a choice of character configs, which are persona bundles the go-between no longer honours, rather than the Live2D models the step claims to be about. Found by walking onboarding on the desktop app against a live Hermes.
What it does today
src/renderer/src/hooks/receiver/use-onboarding.ts:157-159builds the list from the go-between's config files:Those are
characters/*.yaml. On this machine the entire set is upstream Open-LLM-VTuber demo material —en_nuke_debate.yaml,en_unhelpful_ai.yaml,zh_米粒.yaml,zh_翻译腔.yaml. None of them is Denpa's character.Each one carries a
character_configblock holdingpersona_promptandlive2d_model_name.Why it is wrong twice
The persona half is dead.
persona_promptis not referenced anywhere insrc/open_llm_vtuber/—#21stripped the go-between to TTS and Live2D, and the brain is Hermes. Whatever the operator picks here, her personality comes from Hermes' own configuration and is untouched.The half that still works is a footgun.
live2d_model_nameis live (conf.yaml:16currentlymao_pro). Selecting one of the four demo characters switches the active config, so it changes her appearance to that demo's model. A step whose stated purpose is 姿 — appearance — achieves it only by dragging a dead persona along, and only towards characters that are not hers.The copy already describes the intended thing correctly:
MODEL_BODYis 「中継局が持っている姿」, "the appearances the relay station has". The data source does not match the words.What is needed
model_dict.jsonis the register, andconf.yaml:16names the active one — not character config files.characters/*.yaml. If the only live field islive2d_model_nameand the personas are dead, the upstream demo characters are dead weight in the repo and reading them as a menu is what created this. Deleting them is the obvious move; if any is kept, say why.Related
#21— stripped the go-between to TTS and Live2D, which is what madepersona_promptdead#29— the 調整 settings sheet, where a model picker may belong permanentlydenpa/docs/adr/0011-devices-pair-to-the-go-between.md— the wider move of authority off the go-betweenIn v1. Operator's call, 2026-07-30: the dead personas get cleaned up as part of v1, not deferred.
That makes the scope concrete, and it is larger than fixing the picker's data source:
model_dict.json, withconf.yaml:16'slive2d_model_nameas the active one. Selecting one changes her appearance and nothing else.characters/en_nuke_debate.yaml,en_unhelpful_ai.yaml,zh_米粒.yaml,zh_翻译腔.yamlare upstream Open-LLM-VTuber demo material, none of them hers, and theirpersona_promptis referenced nowhere insrc/open_llm_vtuber/since#21stripped the go-between to TTS and Live2D. Deleting them is the point of this issue, not a side effect: while they exist, something will read them as a menu again.character_config—live2d_model_nameis the only live field — gets it from somewhere that is not a persona bundle.The hazard to avoid while doing it:
switch-configcurrently swaps the whole config, which is why picking a "model" today can drag a demo character's appearance along. If the model picker keeps usingswitch-config, this issue is not fixed, only relabelled.Done, across both repos.
Go-between (
aiko/ollvt-hermes-bridge, merged2f9f87, commit168484b; doc follow-upcb6b7d0)characters/en_nuke_debate.yaml,en_unhelpful_ai.yaml,zh_米粒.yaml,zh_翻译腔.yamland the directory's upstream README are deleted.GET /contents/characterson the remote is now a 404. A test asserts the glob stays empty, so nothing can quietly reintroduce a menu.fetch-live2d-models→{"type": "live2d-models", "models": [{name, description}]}, read frommodel_dict.json(live2d_model.py:available_models).switch-live2d-model→{"model": name}callsServiceContext.init_live2dand repliesset-model-and-conf.conf_nameandconf_uidcome back untouched — that is the whole reason it is notswitch-config. A name the register does not hold is refused rather than swallowed byinit_live2d'sexcept, which would have left her in the old body while the viewer was told otherwise.activefield:set-model-and-confalready names the register entry in force, and a second answer to the same question is one that can disagree.Client (
aiko/denpa, merge1b4614b, commitaae2559)websocket-service.tsxsendsfetch-live2d-modelson connect where it sentfetch-configs.hooks/utils/use-switch-model.tssendsswitch-live2d-model. It is notuseSwitchCharacter, andsettings-wired.test.tsnow asserts that in both directions — the trap you named is pinned by a test, not by intent.use-onboarding.ts) listsuseLive2DConfig().modelsand marksmodelInfo?.name.configFiles,confNameandgetFilenameByNameare gone from the hook.use-receiver-chrome.ts:227-229); it drew the same list through the same swap, and leaving it would have left a picker of persona bundles that no longer exist.MODEL_BODY,MODEL_EMPTYandSKIP_COST.modelalready said appearance.Gates. Go-between
227 passed. Client50 files / 770 tests passed(from 48/742),cargo test18 passed,npx tsc --noEmitexits 0 with no output.What I did not do, deliberately, and what should probably become issues:
switch-configis now dead wire and I left it standing. Withcharacters/gone,fetch-configsreturns onlyconf.yaml, so the tray's character submenu (src-tauri/src/tray.rs:178) and the legacy sidebar picker (components/sidebar/setting/general.tsx) degrade to a single entry that reloads the base config. Deleting the path end to end reachestray.rs, its Rust tests,tauri-tray.ts,character-config-context.tsxanduse-switch-character.tsx— which would lower the Rust and vitest counts. That is a deletion issue of its own, not a rider on this one.conf.yaml:7still saysconfig_alts_dir: 'characters', pointing at a directory that no longer exists. Harmless (os.walkyields nothing) but untrue; the field isField(...)-required onSystemConfig, so removing it is a schema change plus both config templates.model_dict.jsonregisters exactly one model (mao_pro), thoughlive2d-models/shizuku/is on disk — upstream trimmed the register in5b889ec. So 姿 currently offers one appearance. That is honest and matches 「中継局が持っている姿」, but it is not yet a choice. Registering more bodies, or moving the picker permanently into #29's 調整, is a separate call I did not make for you.