The TS bulk accessors (#298) ship get_method_bodies with a mechanical omission rule: entries whose code is None are omitted, so every returned value is a real str (documented on the ABC + facade). Python's implementation (cldk/analysis/python/codeanalyzer/codeanalyzer.py:~588, both lines) passes c.code straight through with no None filter, and its docstring makes no 'real str' promise — a Dict[str, str] contract violation whenever a PyCallable carries no source text (latent; needs a repro check for whether the Python analyzer ever emits code=None). Align Python upward to the TS rule on both release lines. Found during #298's final review.
The TS bulk accessors (#298) ship get_method_bodies with a mechanical omission rule: entries whose code is None are omitted, so every returned value is a real str (documented on the ABC + facade). Python's implementation (cldk/analysis/python/codeanalyzer/codeanalyzer.py:~588, both lines) passes c.code straight through with no None filter, and its docstring makes no 'real str' promise — a Dict[str, str] contract violation whenever a PyCallable carries no source text (latent; needs a repro check for whether the Python analyzer ever emits code=None). Align Python upward to the TS rule on both release lines. Found during #298's final review.