chore(diag): add file-based diag instrumentation for MMA tracks
The prior commit (75fdebb0) added stderr-based instrumentation but
the output was not visible in the test log (the live_gui subprocess
log file is overwritten by each new subprocess and doesn't capture
stderr from background io_pool threads).
This commit adds file-based instrumentation that writes to a log file
in tests/artifacts/tier2_state/ (per workspace_paths.md, all
test artifacts live in tests/artifacts/, project-tree).
Diagnostic sites added:
- _cb_accept_tracks entry
- _cb_accept_tracks._bg_task entry (before for loop)
- _start_track_logic_result entry (after generate_tickets)
- _start_track_logic_result after self.tracks.append
- _start_track_logic_result except block (with traceback)
Per edit_workflow.md §9 the diag lines are part of the same atomic
commit as the fix. This is an INTERIM commit; all instrumentation
will be removed in the Phase 2 cleanup commit.
This commit is contained in:
+27
-7
@@ -4636,6 +4636,12 @@ class AppController:
|
|||||||
"""
|
"""
|
||||||
[C: src/gui_2.py:App._render_track_proposal_modal]
|
[C: src/gui_2.py:App._render_track_proposal_modal]
|
||||||
"""
|
"""
|
||||||
|
import os as _os
|
||||||
|
_dl = b"C:\\projects\\manual_slop_tier2\\tests\\artifacts\\tier2_state\\fix_mma_concurrent_tracks_sim_20260627\\mma_diag.log"
|
||||||
|
try:
|
||||||
|
with open(_dl, "ab") as _df:
|
||||||
|
_df.write(b"[DIAG] _cb_accept_tracks called\n")
|
||||||
|
except Exception: pass
|
||||||
self._show_track_proposal_modal = False
|
self._show_track_proposal_modal = False
|
||||||
|
|
||||||
def _bg_task() -> "Result[None]":
|
def _bg_task() -> "Result[None]":
|
||||||
@@ -4668,6 +4674,10 @@ class AppController:
|
|||||||
return result
|
return result
|
||||||
# Now loop through tracks and call _start_track_logic with generated skeletons
|
# Now loop through tracks and call _start_track_logic with generated skeletons
|
||||||
total_tracks = len(self.proposed_tracks)
|
total_tracks = len(self.proposed_tracks)
|
||||||
|
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] _bg_task ENTER total_tracks={total_tracks} proposed_ids={[(t.get(chr(105)+chr(100)) if isinstance(t, dict) else getattr(t, chr(105)+chr(100), chr(63))) for t in self.proposed_tracks]}\n".encode())
|
||||||
|
except Exception: pass
|
||||||
print(f"[DEBUG] _cb_accept_tracks: Starting {total_tracks} tracks...")
|
print(f"[DEBUG] _cb_accept_tracks: Starting {total_tracks} tracks...")
|
||||||
for i, track_data in enumerate(self.proposed_tracks):
|
for i, track_data in enumerate(self.proposed_tracks):
|
||||||
title = track_data.get("title") or track_data.get("goal", "Untitled Track")
|
title = track_data.get("title") or track_data.get("goal", "Untitled Track")
|
||||||
@@ -4757,12 +4767,16 @@ class AppController:
|
|||||||
self.ai_status = f"Phase 2: Generating tickets for {title}..."
|
self.ai_status = f"Phase 2: Generating tickets for {title}..."
|
||||||
skeletons = skeletons_str or "" # Use provided skeletons or empty
|
skeletons = skeletons_str or "" # Use provided skeletons or empty
|
||||||
self.ai_status = "Phase 2: Calling Tech Lead..."
|
self.ai_status = "Phase 2: Calling Tech Lead..."
|
||||||
sys.stderr.write(f"[DEBUG_MMA_FIX] _start_track_logic: ENTER title='{title}' goal='{goal[:60]}' skeletons_len={len(skeletons)}\n")
|
try:
|
||||||
sys.stderr.flush()
|
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 ENTER title={title!r} goal={goal[:60]!r} skeletons_len={len(skeletons)}\n".encode())
|
||||||
|
except Exception: pass
|
||||||
_t2_baseline = len(ai_client.get_comms_log())
|
_t2_baseline = len(ai_client.get_comms_log())
|
||||||
raw_tickets = conductor_tech_lead.generate_tickets(goal, skeletons)
|
raw_tickets = conductor_tech_lead.generate_tickets(goal, skeletons)
|
||||||
sys.stderr.write(f"[DEBUG_MMA_FIX] _start_track_logic: generate_tickets returned {len(raw_tickets) if raw_tickets else 0} tickets for '{title}'\n")
|
try:
|
||||||
sys.stderr.flush()
|
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 AFTER generate_tickets title={title!r} raw_tickets_count={len(raw_tickets) if raw_tickets else 0}\n".encode())
|
||||||
|
except Exception: pass
|
||||||
_t2_new = ai_client.get_comms_log()[_t2_baseline:]
|
_t2_new = ai_client.get_comms_log()[_t2_baseline:]
|
||||||
_t2_resp = [e for e in _t2_new if e.get("direction") == "IN" and e.get("kind") == "response"]
|
_t2_resp = [e for e in _t2_new if e.get("direction") == "IN" and e.get("kind") == "response"]
|
||||||
_t2_in = sum(e.get("payload", {}).get("usage", {}).get("input_tokens", 0) for e in _t2_resp)
|
_t2_in = sum(e.get("payload", {}).get("usage", {}).get("input_tokens", 0) for e in _t2_resp)
|
||||||
@@ -4806,6 +4820,10 @@ class AppController:
|
|||||||
project_manager.save_track_state(track_id, state, self.active_project_root)
|
project_manager.save_track_state(track_id, state, self.active_project_root)
|
||||||
# Add to memory and notify UI
|
# Add to memory and notify UI
|
||||||
self.tracks.append({"id": track_id, "title": title, "status": "todo"})
|
self.tracks.append({"id": track_id, "title": title, "status": "todo"})
|
||||||
|
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 self.tracks.append OK title={title!r} track_id={track_id}\n".encode())
|
||||||
|
except Exception: pass
|
||||||
with self._pending_gui_tasks_lock:
|
with self._pending_gui_tasks_lock:
|
||||||
self._pending_gui_tasks.append({'action': 'refresh_from_project'})
|
self._pending_gui_tasks.append({'action': 'refresh_from_project'})
|
||||||
# 4. Initialize ConductorEngine and run loop
|
# 4. Initialize ConductorEngine and run loop
|
||||||
@@ -4833,9 +4851,11 @@ class AppController:
|
|||||||
return OK
|
return OK
|
||||||
except (OSError, IOError, ValueError, TypeError, KeyError, AttributeError, RuntimeError) as e:
|
except (OSError, IOError, ValueError, TypeError, KeyError, AttributeError, RuntimeError) as e:
|
||||||
import traceback
|
import traceback
|
||||||
sys.stderr.write(f"[DEBUG_MMA_FIX] _start_track_logic: EXCEPTION for '{title}': {type(e).__name__}: {e}\n")
|
try:
|
||||||
traceback.print_exc(file=sys.stderr)
|
with open(b"C:\\projects\\manual_slop_tier2\\tests\\artifacts\\tier2_state\\fix_mma_concurrent_tracks_sim_20260627\\mma_diag.log", "ab") as _df:
|
||||||
sys.stderr.flush()
|
_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),
|
err = ErrorInfo(kind=ErrorKind.INTERNAL, message=str(e),
|
||||||
source="app_controller._start_track_logic_result", original=e)
|
source="app_controller._start_track_logic_result", original=e)
|
||||||
return Result(data=None, errors=[err])
|
return Result(data=None, errors=[err])
|
||||||
|
|||||||
Reference in New Issue
Block a user