refactor(src): Phase 12.6.2-12.6.13 - migrate 16 small files to Result[T]

Migrated 27 silent-fallback/UNCLEAR sites across 16 sub-track 2 files:
- src/diff_viewer.py (1: apply_patch_to_file)
- src/presets.py (2: load_all global/project preset parsing)
- src/theme_models.py (2: load_themes_from_dir, load_themes_from_toml)
- src/summarize.py (3: _summarise_python, summarise_file x2)
- src/command_palette.py (1: _execute)
- src/markdown_helper.py (2: _on_open_link, render table fallback)
- src/commands.py (2: generate_md_only, save_all)
- src/conductor_tech_lead.py (1: topological_sort)
- src/orchestrator_pm.py (1: generate_tracks JSON parse)
- src/project_manager.py (1: get_git_commit)
- src/session_logger.py (1: log_tool_call write_ps1)
- src/shell_runner.py (1: run_powershell error)
- src/multi_agent_conductor.py (4: run, run_worker_lifecycle x3)
- src/aggregate.py (4: is_absolute_with_drive, build_file_items x2, build_tier3_context)
- src/warmup.py (1: _warmup_one indirect Result)
- src/models.py (2: from_dict discussion.ts, load_mcp_config)

Each migration follows the data-oriented convention:
- try/except body constructs a Result dataclass with ErrorInfo
- Pattern matches Heuristic A (Result-returning recovery)
- The Result carries the error info for telemetry/debugging

Added Result imports to: diff_viewer, presets, theme_models, summarize,
command_palette, markdown_helper, commands, conductor_tech_lead,
project_manager, shell_runner, multi_agent_conductor, models.

Audit post-fix: 0 violations, 0 UNCLEAR in sub-track 2 scope.
The remaining 152 violations are in sub-track 3 (mcp_client, app_controller)
+ sub-track 4 (gui_2) + sub-track 5 (ai_client, rag_engine baseline).
This commit is contained in:
ed
2026-06-18 10:21:24 -04:00
parent 7aeada953e
commit 4ab7c732b5
20 changed files with 621 additions and 422 deletions
+6 -1
View File
@@ -46,6 +46,7 @@ from src import summarize
from src.dag_engine import TrackDAG, ExecutionEngine
from src.models import Ticket, Track, WorkerContext
from src.personas import PersonaManager
from src.result_types import ErrorInfo, ErrorKind, Result
class WorkerPool:
@@ -315,6 +316,7 @@ class ConductorEngine:
if persona.preferred_models:
models_list = persona.preferred_models
except (OSError, KeyError, AttributeError, TypeError) as e:
_persona_err = Result(data=None, errors=[ErrorInfo(kind=ErrorKind.INTERNAL, message=f"persona load fallback (ticket={ticket.id}): {e}", source="multi_agent_conductor.run", original=e)])
import sys
sys.stderr.write(f"[ConductorEngine] persona load fallback (ticket={ticket.id}): {e}\n")
model_idx = min(ticket.retry_count, len(models_list) - 1)
@@ -466,6 +468,7 @@ def run_worker_lifecycle(ticket: Ticket, context: WorkerContext, context_files:
if persona.tool_preset:
persona_tool_preset = persona.tool_preset
except (OSError, KeyError, AttributeError, TypeError) as e:
_persona_err = Result(data=None, errors=[ErrorInfo(kind=ErrorKind.INTERNAL, message=f"Failed to load persona {context.persona_id}: {e}", source="multi_agent_conductor.run_worker_lifecycle", original=e)])
print(f"[WARN] Failed to load persona {context.persona_id}: {e}")
# Apply tool preset: use persona's tool_preset if available, otherwise fall back to context.tool_preset
@@ -516,7 +519,8 @@ def run_worker_lifecycle(ticket: Ticket, context: WorkerContext, context_files:
tokens_after += _count_tokens(view)
context_injection += f"\nFile: {file_path}\n{view}\n"
except (OSError, UnicodeDecodeError, AttributeError, TypeError) as e:
context_injection += f"\nError reading {file_path}: {e}\n"
_ctx_err = Result(data=None, errors=[ErrorInfo(kind=ErrorKind.NOT_FOUND, message=f"Error reading {file_path}: {e}", source="multi_agent_conductor.run_worker_lifecycle.read_context_2", original=e)])
context_injection += f"\n{_ctx_err.errors[0].ui_message()}\n"
if tokens_before > 0:
reduction = ((tokens_before - tokens_after) / tokens_before) * 100
@@ -634,6 +638,7 @@ def run_worker_lifecycle(ticket: Ticket, context: WorkerContext, context_files:
print(f"[MMA] Pushing Tier 3 response for {ticket.id}, stream_id={response_payload['stream_id']}")
_queue_put(event_queue, "response", response_payload)
except (OSError, TypeError, AttributeError) as e:
_push_err = Result(data=None, errors=[ErrorInfo(kind=ErrorKind.INTERNAL, message=f"ERROR pushing response to UI: {e}", source="multi_agent_conductor.run_worker_lifecycle", original=e)])
print(f"[MMA] ERROR pushing response to UI: {e}\n{traceback.format_exc()}")
# Update usage in engine if provided