Found via CodeRabbit review on #814 (verified): Python suppresses DeprecationWarning by default everywhere except code running directly in __main__. bmad_loop.policy.loads() lives in library code reached through bmad_loop.cli, not __main__, and nothing in cli.py broadens the global filter for the normal command path (the one warnings.simplefilter("always") call in cli.py is scoped to a catch_warnings() block inside _validate_plugin_manifests, unrelated to policy loading).
This means both the pre-existing [engine] deprecation notice (_fold_deprecated_engine) and the new legacy-retry-mode notice added in #814 emit a real DeprecationWarning, covered by pytest.warns in tests, but a user running bmad-loop normally will likely never see either — pytest.warns establishes the warning fires, not that it reaches the user.
Suggested directions (not prescribing one)
Scope note
This is cross-cutting (affects at least #811 and #814, both currently open/ready), not specific to one PR, so it deserves its own decision rather than a one-off fix inside either PR.
Found via CodeRabbit review on #814 (verified): Python suppresses
DeprecationWarningby default everywhere except code running directly in__main__.bmad_loop.policy.loads()lives in library code reached throughbmad_loop.cli, not__main__, and nothing incli.pybroadens the global filter for the normal command path (the onewarnings.simplefilter("always")call incli.pyis scoped to acatch_warnings()block inside_validate_plugin_manifests, unrelated to policy loading).This means both the pre-existing
[engine]deprecation notice (_fold_deprecated_engine) and the new legacy-retry-mode notice added in #814 emit a realDeprecationWarning, covered bypytest.warnsin tests, but a user runningbmad-loopnormally will likely never see either —pytest.warnsestablishes the warning fires, not that it reaches the user.Suggested directions (not prescribing one)
FutureWarningorUserWarning, matching what fix(tea-plugin): surface a one-time session-cost notice at plugin activation #805/fix(policy): warn when scm.max_parallel is silently clamped to 1 #812 already use) for user-facing deprecation notices inpolicy.py, orDeprecationWarningdisplay forbmad_loop's own warnings at the CLI entry point (e.g.warnings.filterwarnings("default", category=DeprecationWarning, module=r"bmad_loop\..*")).Scope note
This is cross-cutting (affects at least #811 and #814, both currently open/ready), not specific to one PR, so it deserves its own decision rather than a one-off fix inside either PR.