{ "job_id": "work-2026-05-04-codexdashboard-validate-sqlite-tests", "status": "validated", "validated_at": "2026-05-04", "objective": "Validate that adding tests for SQLite schema drift / visible DB errors is narrow enough and identify exact files/tests. No implementation.", "repo": "/home/smlflg/Projekte/CodexDashBoard", "audit_input": "artifacts/codex-audit/result.json", "current_checks": [ { "command": "python3 -m pytest", "exit_code": 0, "result": "16 passed in 0.28s" } ], "evidence": [ "Audit top task rank 1 is 'Add Codex SQLite schema-drift coverage and user-visible data errors'.", "src/codex_dashboard/codex_data.py:list_threads catches FileNotFoundError/sqlite3.Error and returns []; get_stats returns zero DashboardStats; list_logs returns [].", "src/codex_dashboard/app.py refresh handlers treat returned empty lists/stats as successful refreshes and render 'No Codex sessions found' or 'No Codex logs found', so DB errors are not currently distinguishable from no data.", "tests/test_codex_data.py currently covers normal state.sqlite listing and missing stats DB only.", "tests/test_crash_safety.py currently covers locked/minimal DB returning empty quickly, but not real schema drift, malformed values, normal logs DB, or visible DB error state." ], "recommended_scope": { "size": "small_to_medium", "narrow_enough": true, "summary": "Keep the implementation limited to Codex SQLite data access error reporting and focused data-layer/UI-status tests. Do not combine with process matching, launch assets, GTK action refactors, or Claude helper cleanup.", "phases": [ "Add focused failing tests for state.sqlite schema drift and logs_2.sqlite fixtures.", "Add/adjust a minimal data-access result/error seam so SQLite schema/permission/corruption failures remain crash-safe but are visible to callers.", "Add a narrow UI/status test seam or AST-level guard proving sessions/log refresh can present a data-access error distinct from empty data." ], "out_of_scope": [ "GTK row rendering and button behavior beyond DB-error status visibility", "process scanner false-positive policy", "systemd/desktop relocatability", "Claude data helpers", "dependency installation or broad GUI integration testing" ], "production_code_likely_needs_change": true, "production_change_reason": "Tests can be added first, but user-visible DB errors cannot pass with tests alone because current codex_data functions collapse sqlite3.Error into empty results/zero stats and app.py marks those refreshes successful. A minimal non-crashing error state or result wrapper is likely needed." }, "files_to_touch": [ { "path": "src/codex_dashboard/codex_data.py", "purpose": "Likely add minimal error-reporting/data-result seam while preserving no-crash behavior for FileNotFoundError/sqlite3.Error." }, { "path": "src/codex_dashboard/app.py", "purpose": "Likely teach refresh/status layer to distinguish empty data from data access errors for sessions/logs/overview." }, { "path": "tests/test_codex_data.py", "purpose": "Add focused state.sqlite schema drift, malformed/null field, and stats error tests." }, { "path": "tests/test_logs_data.py", "purpose": "New focused logs_2.sqlite fixture tests for normal list_logs/search and logs schema drift/corrupt DB handling." }, { "path": "tests/test_crash_safety.py", "purpose": "Optionally keep/add crash-safety regression that DB failures return quickly and never raise; avoid broadening this file into schema fixture coverage." }, { "path": "tests/test_data_error_visibility.py", "purpose": "Optional new narrow test module for app/status seam if UI visibility is not covered in codex_data tests." } ], "tests_to_add": [ { "file": "tests/test_codex_data.py", "test": "test_list_threads_schema_drift_missing_timestamp_columns_reports_data_error", "intent": "Create a threads table missing created_at_ms/updated_at_ms and/or created_at/updated_at expected by the SELECT; assert the failure is represented as a data access error, not silently indistinguishable from no sessions." }, { "file": "tests/test_codex_data.py", "test": "test_list_threads_schema_drift_missing_search_columns_reports_data_error", "intent": "Create a threads table missing title/first_user_message/cwd/git_branch and assert query/listing does not crash and exposes schema drift." }, { "file": "tests/test_codex_data.py", "test": "test_list_threads_malformed_tokens_or_timestamps_are_bounded", "intent": "Use non-integer/null-heavy tokens_used and timestamp fields; assert either safe coercion or explicit row/data error behavior is defined and tested." }, { "file": "tests/test_codex_data.py", "test": "test_get_stats_schema_drift_reports_error_without_exception", "intent": "Assert get_stats preserves crash safety while exposing database/schema failure instead of only DashboardStats(0,0,0,0,None)." }, { "file": "tests/test_logs_data.py", "test": "test_list_logs_reads_codex_logs_fixture_and_searches", "intent": "Create logs table with id, ts, ts_nanos, level, target, thread_id, module_path, feedback_log_body; assert ordering, timestamp ms conversion, shortening/search." }, { "file": "tests/test_logs_data.py", "test": "test_list_logs_schema_drift_missing_expected_columns_reports_data_error", "intent": "Create logs table missing module_path or feedback_log_body/ts_nanos; assert no exception and visible error state." }, { "file": "tests/test_data_error_visibility.py", "test": "test_session_refresh_status_distinguishes_database_error_from_no_sessions", "intent": "Using a headless seam/mocked data function or extracted presenter, assert DB error maps to an error/degraded status rather than '0 sessions' and 'No Codex sessions found'." }, { "file": "tests/test_data_error_visibility.py", "test": "test_log_refresh_status_distinguishes_database_error_from_no_logs", "intent": "Using the same seam, assert logs DB error maps to visible error status rather than '0 log rows' and 'No Codex logs found'." } ], "verifier_command": "test -s artifacts/codex-validate/sqlite-tests-validation.json", "notes": [ "No source code was changed by this validation worker.", "The artifact recommends exact implementation/test scope only; it does not implement tests or production changes." ] }