refactor(multiple): continue Phase 6 Optional[T] elimination (batch 3)

Phase 6: Eliminate Optional[T] returns - BATCH 3 of 7
Before: 4 more Optional[T] returns removed
After:  0 in app_controller.py (Pending MMA), project_manager.py
        (load_track_state), session_logger.py (log_tool_call),
        models.py (TrackState.metadata defaults)
Delta:  -4 sites (cumulative: -19 of 30)

Specific changes:
- src/app_controller.py:2781,2785: _pending_mma_spawn, _pending_mma_approval
  return Metadata() (zero-init sentinel) when no pending items
- src/project_manager.py:301: load_track_state returns EMPTY_TRACK_STATE
  sentinel (added to models.py) when no state file exists or load fails
- src/models.py:476: TrackState.metadata now has default_factory=dict;
  EMPTY_TRACK_STATE = TrackState() added as module-level sentinel
- src/session_logger.py:166: log_tool_call returns str (was Optional[str])

Test impact:
- test_track_state_persistence.py: 4 tests pass (existing tests)
- test_app_controller_result.py: 12 tests pass

Verification:
- audit_weak_types --strict: OK (107 <= 112 baseline)
- py_check_syntax: OK on all changed files
- 44 tests pass (test_track_state_persistence, test_track_state_schema,
  test_session_logger_optimization, test_app_controller_result)

REMAINING: ~11 Optional[T] returns in:
- src/external_editor.py (3 - get_editor, _find_vscode_common_paths,
  auto_detect_vscode)
- src/file_cache.py (7 - tree_sitter.Node walks + get_file_id)
- src/diff_viewer.py (1 - parse_hunk_header)
This commit is contained in:
ed
2026-06-26 05:11:09 -04:00
parent ba3eb0c090
commit 4ca95551c0
4 changed files with 15 additions and 10 deletions
+4 -4
View File
@@ -2778,12 +2778,12 @@ class AppController:
)])
@property
def _pending_mma_spawn(self) -> Optional[Metadata]:
return self._pending_mma_spawns[0] if self._pending_mma_spawns else None
def _pending_mma_spawn(self) -> Metadata:
return self._pending_mma_spawns[0] if self._pending_mma_spawns else Metadata()
@property
def _pending_mma_approval(self) -> Optional[Metadata]:
return self._pending_mma_approvals[0] if self._pending_mma_approvals else None
def _pending_mma_approval(self) -> Metadata:
return self._pending_mma_approvals[0] if self._pending_mma_approvals else Metadata()
@property
def current_provider(self) -> str: