|
|
@@ -1,56 +0,0 @@
|
|
|
-# Fix genre source validation and story-system fallback
|
|
|
-
|
|
|
-## Goal
|
|
|
-
|
|
|
-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.
|
|
|
-
|
|
|
-## What I already know
|
|
|
-
|
|
|
-* The user confirmed the desired behavior: normalize the source, forbid English genre values, and explicitly error instead of using `玄幻退婚流` 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 `玄幻退婚流`.
|
|
|
-
|
|
|
-## Requirements
|
|
|
-
|
|
|
-* Initialization must reject genre values containing ASCII letters, such as `rules-mystery`, with an actionable error that points users to Chinese names such as `规则怪谈`.
|
|
|
-* Story-system routing must not use the first CSV row as a default route when no match exists.
|
|
|
-* If story-system cannot route the provided query/genre, it must raise an explicit error and avoid generating `.story-system` contracts.
|
|
|
-* Valid Chinese genres such as `规则怪谈` must continue to route normally.
|
|
|
-* Existing profile-key behavior may remain as internal read-only compatibility, but it must not be accepted as project genre input.
|
|
|
-
|
|
|
-## Acceptance Criteria
|
|
|
-
|
|
|
-* [ ] `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 `悬疑`.
|
|
|
-* [ ] No test expects unmatched routes to fall back to `玄幻退婚流`.
|
|
|
-* [ ] Targeted tests pass.
|
|
|
-
|
|
|
-## Definition of Done
|
|
|
-
|
|
|
-* Tests added or updated for init validation and story-system routing failure.
|
|
|
-* Targeted pytest suite passes.
|
|
|
-* Existing unrelated working-tree changes are preserved.
|
|
|
-
|
|
|
-## Technical Approach
|
|
|
-
|
|
|
-* Add a narrow genre-input validator near initialization write boundaries.
|
|
|
-* Replace story-system's `default_seed_fallback` branch with an explicit failure path.
|
|
|
-* Keep canonical Chinese genre routing through existing `resolve_genre()` / route row matching.
|
|
|
-
|
|
|
-## Out of Scope
|
|
|
-
|
|
|
-* Reworking reference retrieval ranking.
|
|
|
-* Migrating existing projects that already have English genre values.
|
|
|
-* Renaming legacy profile IDs in `genre-profiles.md`.
|
|
|
-* Changing chapter-level dynamic context selection beyond route failure behavior.
|
|
|
-
|
|
|
-## Technical Notes
|
|
|
-
|
|
|
-* Likely files:
|
|
|
- * `webnovel-writer/scripts/init_project.py`
|
|
|
- * `webnovel-writer/scripts/data_modules/story_system_engine.py`
|
|
|
- * `webnovel-writer/scripts/data_modules/tests/test_story_system_engine.py`
|
|
|
- * `webnovel-writer/scripts/data_modules/tests/test_init_project_pruning.py` or a nearby init test module
|
|
|
-* Existing dirty files were present before this task; do not revert unrelated changes.
|