From e9919059bba9b89011e150a36affba641b63febf Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sat, 27 Jun 2026 14:08:10 -0400 Subject: [PATCH] fix(mma_concurrent): import TrackMetadata directly to fix NameError MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause: src/app_controller.py:_start_track_logic_result used 'models.Metadata(...)' on line 4830 but the 'from src import models' import was removed in commit ee763eea (the de-cruft migration). The existing EXCEPT block catches only 7 exception types (OSError, IOError, ValueError, TypeError, KeyError, AttributeError, RuntimeError) - NOT NameError. So the NameError propagated up, the io_pool worker died, and the for loop in _cb_accept_tracks._bg_task never reached track-b. Fix: - Add TrackMetadata to the 'from src.mma import' line - Change 'models.Metadata(...)' to 'TrackMetadata(...)' - Restore the EXCEPT block to the original 7 types (narrowing the BaseException diagnostic back) The diagnostic instrumentation logs are kept in this commit per edit_workflow.md ยง9 ('diag lines are part of the same atomic commit as the fix'). They will be removed in the Phase 2 cleanup commit. Verified: test_mma_concurrent_tracks_execution now PASSES (35.88s FAIL -> 7.95s PASS). Diag log shows full pipeline: _cb_accept_tracks -> _bg_task (2 tracks) -> Track A pipeline complete -> Track B pipeline complete -> 2 tracks in self.tracks. --- src/app_controller.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/app_controller.py b/src/app_controller.py index c5a69d08..c0e681f7 100644 --- a/src/app_controller.py +++ b/src/app_controller.py @@ -1,6 +1,6 @@ from __future__ import annotations from src.tool_presets import ToolPreset -from src.mma import Ticket, Track, TrackState +from src.mma import Ticket, Track, TrackState, TrackMetadata from src.personas import Persona from src.mcp_client import MCPConfiguration, RAGConfig, load_mcp_config from src.project_files import ContextPreset, FileItem, NamedViewPreset, Preset @@ -4796,8 +4796,16 @@ class AppController: print(f"Warning: No tickets generated for track: {title}") return OK self.ai_status = "Phase 2: Sorting tickets..." + try: + with open(b"C:\\projects\\manual_slop_tier2\\tests\\artifacts\\tier2_state\\fix_mma_concurrent_tracks_sim_20260627\\mma_diag.log", "ab") as _df: + _df.write(b"[DIAG] BEFORE _topological_sort_tickets_result\n") + except Exception: pass sort_result = self._topological_sort_tickets_result(raw_tickets, title) sorted_tickets_data = sort_result.data + try: + with open(b"C:\\projects\\manual_slop_tier2\\tests\\artifacts\\tier2_state\\fix_mma_concurrent_tracks_sim_20260627\\mma_diag.log", "ab") as _df: + _df.write(f"[DIAG] AFTER sort sorted_count={len(sorted_tickets_data) if sorted_tickets_data else 0} type={type(sorted_tickets_data[0]).__name__ if sorted_tickets_data else None}\n".encode()) + except Exception: pass # 3. Create Track and Ticket objects (sorted_tickets_data is list[Ticket]) tickets = [] for t_data in sorted_tickets_data: @@ -4814,10 +4822,18 @@ class AppController: tickets.append(ticket) track_id = f"track_{uuid.uuid5(uuid.NAMESPACE_DNS, f'{self.active_project_path}_{title}').hex[:12]}" track = Track(id=track_id, description=title, tickets=tickets) + try: + with open(b"C:\\projects\\manual_slop_tier2\\tests\\artifacts\\tier2_state\\fix_mma_concurrent_tracks_sim_20260627\\mma_diag.log", "ab") as _df: + _df.write(b"[DIAG] BEFORE save_track_state\n") + except Exception: pass # Initialize track state in the filesystem - meta = models.Metadata(id=track_id, name=title, status="todo", created_at=datetime.now(), updated_at=datetime.now()) + meta = TrackMetadata(id=track_id, name=title, status="todo", created_at=datetime.now(), updated_at=datetime.now()) state = TrackState(metadata=meta, discussion=[], tasks=tickets) project_manager.save_track_state(track_id, state, self.active_project_root) + try: + with open(b"C:\\projects\\manual_slop_tier2\\tests\\artifacts\\tier2_state\\fix_mma_concurrent_tracks_sim_20260627\\mma_diag.log", "ab") as _df: + _df.write(b"[DIAG] AFTER save_track_state\n") + except Exception: pass # Add to memory and notify UI self.tracks.append({"id": track_id, "title": title, "status": "todo"}) try: @@ -4850,12 +4866,6 @@ class AppController: sys.stderr.flush() return OK except (OSError, IOError, ValueError, TypeError, KeyError, AttributeError, RuntimeError) as e: - import traceback - try: - with open(b"C:\\projects\\manual_slop_tier2\\tests\\artifacts\\tier2_state\\fix_mma_concurrent_tracks_sim_20260627\\mma_diag.log", "ab") as _df: - _df.write(f"[DIAG] _start_track_logic_result EXCEPTION title={title!r} {type(e).__name__}: {e}\n".encode()) - traceback.print_exc(file=_df) - except Exception: pass err = ErrorInfo(kind=ErrorKind.INTERNAL, message=str(e), source="app_controller._start_track_logic_result", original=e) return Result(data=None, errors=[err])