23d8a53f6a
Fix 25 of 27 review findings from PR #618 code review: P1 (Must Fix): - F3: Fix silent data corruption in _merge_collection for properties dict fields (was falling through to string list merge) - F1: Split 1023-line step file into 3 files + helper module (all <500) - F4: Add SELECT FOR UPDATE lock on parent type in register_type to prevent TOCTOU race in concurrent registrations - F6: Fix docs claiming exceptions inherit from CleverAgentsError (they inherit from ValueError) - F7: Fix docs incorrectly describing validate_chain return type P2 (Should Fix): - F9: Replace dict[str, Any] with TypeRegistryMap type alias - F10: Replace import logging with structlog in inheritance.py - F11: Add __all__ to inheritance.py - F13: Fix _load_type_registry to derive built_in from namespace column - F14: Add warning log for unregistered types in resolve_inheritance_chain - F15: Return defensive copies from resolve_fields - F16: Add chain validation to bootstrap_builtin_types - F17: Narrow except Exception to specific types in step files - F18: Add side-effect verification scenarios after error cases - F19: Always include inherits key in JSON output for consistent schema - F20: Log actual exception instead of hardcoded string in CLI P3 (Nit): - F21: Reject whitespace-only inherits values in validate_chain - F23: Wrap chain errors in HandlerResolutionError in resolver - F24: Return defensive copies from as_cli_dict - F25: Replace tautological assertion with ResourceHandler isinstance - F26: Add whitespace inherits test scenario - F27: Fix find_subtypes docstring to note it excludes ancestor_name Deferred: - F2: type: ignore in step files — pyright only checks src/, matches existing project pattern (91 occurrences in resource_dag_steps.py) - F5: CLI integration tests require full DI container setup - F8: resource_registry_service.py size is pre-existing (971 on master) - F12: Coverage boost file changes are test adaptations, not scope creep - F22: FK constraint intentionally omitted per docs (SQLite compat)