{ "title": "Split code_tutor/_challenge_support.py under the 250-line cap", "objective": "Bring python_pkg/code_tutor/_challenge_support.py (402 lines) under the repo-wide 250-line cap by moving the isolated pytest runner and the LLM verdict streaming into their own modules.", "acceptance_criteria": [ "_challenge_support.py, _pytest_runner.py and _verdict.py are each at most 250 lines.", "The code_tutor suite still reports exactly 216 passing tests -- the same count as before the split, proving no test was dropped or silently skipped.", "The package keeps 100% branch coverage of the code_tutor source modules.", "Every patch string naming a moved function or one of its plain-import collaborators is repointed at the module the code actually lives in now. code_tutor uses absolute patch strings rather than a MOD constant, so this is a per-string edit and cannot be done with one substitution.", "_challenge.py imports _patch_and_test, _pytest_clean, _parse_verdict and _stream_verdict back, because test_challenge_part3.py patches the first two on _challenge.", "No assertion is changed and no test is deleted, skipped or weakened.", "No suppression is added and no coverage exclusion is introduced." ], "out_of_scope": [ "Changing what any test asserts, or any pytest invocation flags.", "Splitting _challenge.py, cli.py, _analyzer.py or the code_tutor test modules, which are separate commits.", "Adding a re-export shim in _challenge_support; importers point at the new modules directly to keep the dependency direction one-way." ], "verifier": "PYTHONPATH=. python3 -m pytest python_pkg/code_tutor/tests -q (expects exactly 216 passed), plus an import-time attribute probe over the four modules, plus pre-commit run --files on the touched files." }