7a9261c425
3 surgical fixes: 1. src/openai_schemas.py: add custom __init__ to NormalizedResponse that accepts BOTH the new nested usage: UsageStats AND the legacy flat usage_input_tokens=... kwargs. Fixes 12 of the 14 failing tests in one place (no test changes needed). 2. tests/test_auto_whitelist.py: use dataclasses.replace() instead of mutating a frozen Session via dict assignment. 3. tests/test_command_palette_sim.py: use a deterministic close callback (or push toggle twice as fallback) instead of the non-deterministic _toggle_command_palette callback. 4 phases, 4 tasks, 6 atomic commits expected. Verification: full scripts/run_tests_batched.py is green; 4 audit gates remain clean; no new failures introduced.
59 lines
2.4 KiB
JSON
59 lines
2.4 KiB
JSON
{
|
|
"track_id": "fix_test_failures_20260624",
|
|
"name": "Fix 14 Test Failures (post-polish merge)",
|
|
"created_date": "2026-06-24",
|
|
"branch": "master",
|
|
"depends_on": ["code_path_audit_polish_20260622"],
|
|
"blocks": [],
|
|
"scope": {
|
|
"new_files": [],
|
|
"modified_files": [
|
|
"src/openai_schemas.py",
|
|
"tests/test_auto_whitelist.py",
|
|
"tests/test_command_palette_sim.py"
|
|
],
|
|
"deleted_files": []
|
|
},
|
|
"estimated_effort": {
|
|
"method": "scope (per workflow.md §Tier 1 Track Initialization Rules). NO day estimates.",
|
|
"phase_1": "1 task: add custom __init__ to NormalizedResponse (fixes 12 tests)",
|
|
"phase_2": "1 task: update test_auto_whitelist_keywords to use dataclasses.replace",
|
|
"phase_3": "1 task: update test_palette_starts_hidden to use deterministic close",
|
|
"phase_4": "1 task: 6 verification criteria + TRACK_COMPLETION + state + tracks.md"
|
|
},
|
|
"verification_criteria": [
|
|
"VC1: 12 NormalizedResponse tests pass",
|
|
"VC2: test_auto_whitelist_keywords passes",
|
|
"VC3: test_palette_starts_hidden passes",
|
|
"VC4: full batched test suite is green (all 11 tiers PASS)",
|
|
"VC5: 4 audit gates remain clean",
|
|
"VC6: no new test failures introduced"
|
|
],
|
|
"known_issues": [],
|
|
"deferred_to_followup_tracks": [],
|
|
"regressions_and_pre_existing_failures": [],
|
|
"pre_existing_failures_remaining": [],
|
|
"risk_register": [
|
|
{
|
|
"id": "risk-1",
|
|
"description": "Custom __init__ with init=False breaks other NormalizedResponse callers passing positional args",
|
|
"likelihood": "low",
|
|
"impact": "Phase 1 Task 1.1 may break production code at src/ai_client.py:908 or the 12 tests",
|
|
"mitigation": "All 12 tests + 1 production site use kwargs; verify with ast.parse + 12-test run"
|
|
},
|
|
{
|
|
"id": "risk-2",
|
|
"description": "dataclasses.replace for Session may not work if Session is slotted or has __slots__",
|
|
"likelihood": "low",
|
|
"impact": "Phase 2 Task 2.1 fails",
|
|
"mitigation": "Session is a regular @dataclass(frozen=True); replace() works on regular dataclasses"
|
|
},
|
|
{
|
|
"id": "risk-3",
|
|
"description": "A deterministic close callback does not exist in _predefined_callbacks",
|
|
"likelihood": "medium",
|
|
"impact": "Phase 3 Task 3.1 needs fallback (push toggle twice)",
|
|
"mitigation": "Plan includes the toggle-twice fallback in the Task 3.1 WHAT description"
|
|
}
|
|
]
|
|
} |