Prevent English profile keys such as rules-mystery from becoming project genre truth, and make story-system fail explicitly instead of falling back to the first route row (玄幻退婚流) when a genre cannot be routed.
玄幻退婚流 as a fallback.rules-mystery originates from the legacy genre profile layer (references/genre-profiles.md) and profile-key mapping, not from the story-system CSV route table.init_project.py currently writes the CLI genre argument directly into .webnovel/state.json.story_system_engine._route() currently falls back to route_rows[0] when no route matches, which can silently select 玄幻退婚流.rules-mystery, with an actionable error that points users to Chinese names such as 规则怪谈..story-system contracts.规则怪谈 must continue to route normally.init_project(..., genre="rules-mystery") fails before writing state.StorySystemEngine(...).build(query="rules-mystery", genre="rules-mystery", ...) raises an explicit routing error.StorySystemEngine(...).build(query="规则怪谈", genre="规则怪谈", ...) routes to canonical genre 悬疑.玄幻退婚流.default_seed_fallback branch with an explicit failure path.resolve_genre() / route row matching.genre-profiles.md.webnovel-writer/scripts/init_project.pywebnovel-writer/scripts/data_modules/story_system_engine.pywebnovel-writer/scripts/data_modules/tests/test_story_system_engine.pywebnovel-writer/scripts/data_modules/tests/test_init_project_pruning.py or a nearby init test module