Status: Shipped
PR: #90
Depends on: milestones/config-mapping-keys.md (PR #83),
milestones/segment-id-strings.md (PR #87)
pages.segmentsas a list —_resolve_segments_cfgonly used the block when it was a non-empty mapping. A list fell through to discovery and silently ignored maintainer titles.narration_from_source.context.pathsas a string —_as_str_listwrapped a single string as one path (OK) but a mapping or other type became[], so narration-generate ran with no focus files.manim_scene_generationas a list — was not in the Config mapping-key gate; later code treated it as{}.
Fail closed at Config.from_yaml for those nested types.
-
pages.segmentsif present must be a mapping (keys still quoted strings). -
narration_from_source/manim_scene_generationhints,context.paths,context.globsmust be string lists;segmentsa mapping of mappings. - Tests for list
pages.segments, stringcontext.paths, listnarration_from_source.segments, string per-segment row, listmanim_scene_generation. -
ruff check src/ tests/ -
pytest tests/ -
docgen benchmark(no clock change)
_as_str_liststill wraps a single string as a one-item list for library callers that do not go throughConfig.from_yaml- Empty
pages.segments: {}still falls back to discovery