Context
Found during the 360 review pass over #474 (which removed the no-model demo path from first-run). #474's backstop only guards POST /api/sessions. The Creator Workbench creates preview sessions through a different path — POST /api/workbench/packs/{kind}/{slug}/test-session (start_test_session) — whose own docstring notes the session "can be used with the standard /api/sessions/{id}/turn endpoint."
That workbench setup dict carries no runtime_id pin, so _resolve_runtime falls back to the shared app.state.runtime. On a profile with no model installed, that shared runtime is the config default fake (config.py: runtime_id = "fake"), whose every reply is the canned "Hello there. I am a simulated NPC."
Why it matters
A creator authoring a scenario without a model installed previews it against the fake responder — the same "it's just a chatbot" first impression #473 cured for new players, in a different surface. The Workbench sits behind FirstRunGuard, and an incomplete profile (outcome recorded, no model) can reach /workbench, so this is reachable, not theoretical. It's pre-existing (not introduced by #474), and the new 409 backstop deliberately does not cover this route.
Suggested direction (maintainer's call)
A scenario preview is only meaningful against a real model, so the honest behavior is to require one: when the resolved runtime for a workbench test session is model-free (fake/scripted), return a clear "install a model to preview your scenario" response instead of silently serving canned replies. Pinning scripted is not a fix — that runtime only knows the first-words tutorial script, not arbitrary authored scenarios.
References
🤖 Generated with Claude Code
https://claude.ai/code/session_01C9WmcidRL3ABq7qhWHUsrG
Context
Found during the 360 review pass over #474 (which removed the no-model demo path from first-run). #474's backstop only guards
POST /api/sessions. The Creator Workbench creates preview sessions through a different path —POST /api/workbench/packs/{kind}/{slug}/test-session(start_test_session) — whose own docstring notes the session "can be used with the standard/api/sessions/{id}/turnendpoint."That workbench setup dict carries no
runtime_idpin, so_resolve_runtimefalls back to the sharedapp.state.runtime. On a profile with no model installed, that shared runtime is the config defaultfake(config.py: runtime_id = "fake"), whose every reply is the canned "Hello there. I am a simulated NPC."Why it matters
A creator authoring a scenario without a model installed previews it against the fake responder — the same "it's just a chatbot" first impression #473 cured for new players, in a different surface. The Workbench sits behind
FirstRunGuard, and anincompleteprofile (outcome recorded, no model) can reach/workbench, so this is reachable, not theoretical. It's pre-existing (not introduced by #474), and the new 409 backstop deliberately does not cover this route.Suggested direction (maintainer's call)
A scenario preview is only meaningful against a real model, so the honest behavior is to require one: when the resolved runtime for a workbench test session is model-free (
fake/scripted), return a clear "install a model to preview your scenario" response instead of silently serving canned replies. Pinningscriptedis not a fix — that runtime only knows the first-words tutorial script, not arbitrary authored scenarios.References
services/convsim-core/convsim_core/routers/workbench.pystart_test_session_resolve_runtimeinservices/convsim-core/convsim_core/routers/sessions.py🤖 Generated with Claude Code
https://claude.ai/code/session_01C9WmcidRL3ABq7qhWHUsrG