borisxdave 0.3.5__tar.gz → 0.3.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: borisxdave
3
- Version: 0.3.5
3
+ Version: 0.3.6
4
4
  Summary: Boris - Autonomous Project Orchestrator
5
5
  Requires-Python: >=3.8
6
6
  Dynamic: requires-python
@@ -1181,21 +1181,36 @@ def main():
1181
1181
  # Process verdicts sequentially (corrections/retries run sequentially)
1182
1182
  batch_summary = {}
1183
1183
  for milestone, result in parallel_results:
1184
- print(f"[Boris] TURBO: Checking verdict for {milestone.id}...", flush=True)
1185
- verdict_result = engine.check(result, milestone)
1186
- logger.info(
1187
- "TURBO milestone %s verdict: %s - %s",
1188
- milestone.id,
1189
- verdict_result.verdict.value,
1190
- verdict_result.reason,
1191
- )
1192
-
1193
- _process_milestone_verdict(
1194
- verdict_result, result, milestone, plan, st,
1195
- project_dir, args, logger, prompt_map[milestone.id]
1196
- )
1184
+ try:
1185
+ print(f"[Boris] TURBO: Checking verdict for {milestone.id}...", flush=True)
1186
+ verdict_result = engine.check(result, milestone)
1187
+ logger.info(
1188
+ "TURBO milestone %s verdict: %s - %s",
1189
+ milestone.id,
1190
+ verdict_result.verdict.value,
1191
+ verdict_result.reason,
1192
+ )
1193
+
1194
+ _process_milestone_verdict(
1195
+ verdict_result, result, milestone, plan, st,
1196
+ project_dir, args, logger, prompt_map[milestone.id]
1197
+ )
1198
+ except Exception as e:
1199
+ print(f"[Boris] TURBO: Error processing verdict for {milestone.id}: {e}", flush=True)
1200
+ logger.error("Verdict processing error for %s: %s", milestone.id, e)
1201
+ milestone.status = "skipped"
1202
+ state_module.save(st)
1197
1203
  batch_summary[milestone.id] = milestone.status.upper()
1198
1204
 
1205
+ # Safety net: any milestone still in_progress after batch must be marked skipped
1206
+ for m in ready:
1207
+ if m.status == "in_progress":
1208
+ print(f"[Boris] TURBO: {m.id} still in_progress after batch - marking skipped", flush=True)
1209
+ logger.warning("Milestone %s stuck in_progress after batch, marking skipped", m.id)
1210
+ m.status = "skipped"
1211
+ batch_summary[m.id] = "SKIPPED"
1212
+ state_module.save(st)
1213
+
1199
1214
  # Convergence phase: reconcile type conflicts from parallel workers
1200
1215
  if not getattr(args, 'no_converge', False):
1201
1216
  completed_in_batch = [m for m, r in parallel_results if m.status == "completed"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: borisxdave
3
- Version: 0.3.5
3
+ Version: 0.3.6
4
4
  Summary: Boris - Autonomous Project Orchestrator
5
5
  Requires-Python: >=3.8
6
6
  Dynamic: requires-python
@@ -609,19 +609,27 @@ def run_parallel(tasks: list, project_dir: str, max_iterations: int = None,
609
609
  with concurrent.futures.ThreadPoolExecutor(max_workers=len(tasks)) as executor:
610
610
  futures = {executor.submit(_run_one_worktree, t): t for t in tasks}
611
611
  for future in concurrent.futures.as_completed(futures):
612
- milestone, result = future.result()
613
- # Merge worktree back if it was used
614
- wt_info = worktree_map.get(milestone.id)
615
- if wt_info and result.resolved:
616
- wt_path, branch = wt_info
617
- merge_ok = _merge_worktree(project_dir, wt_path, branch, milestone.id)
618
- if not merge_ok:
619
- print(f" [Boris] WARNING: Merge conflict for {milestone.id} worktree", flush=True)
620
- logger.warning("Worktree merge conflict for %s", milestone.id)
621
- elif wt_info:
622
- # Failed milestone - just clean up worktree
623
- _cleanup_worktree(project_dir, wt_info[0], wt_info[1])
624
- results.append((milestone, result))
612
+ try:
613
+ milestone, result = future.result()
614
+ # Merge worktree back if it was used
615
+ wt_info = worktree_map.get(milestone.id)
616
+ if wt_info and result.resolved:
617
+ wt_path, branch = wt_info
618
+ merge_ok = _merge_worktree(project_dir, wt_path, branch, milestone.id)
619
+ if not merge_ok:
620
+ print(f" [Boris] WARNING: Merge conflict for {milestone.id} worktree", flush=True)
621
+ logger.warning("Worktree merge conflict for %s", milestone.id)
622
+ elif wt_info:
623
+ # Failed milestone - just clean up worktree
624
+ _cleanup_worktree(project_dir, wt_info[0], wt_info[1])
625
+ results.append((milestone, result))
626
+ except Exception as e:
627
+ # Worker crashed - return a failed result
628
+ _, crashed_milestone = futures[future]
629
+ print(f" [Boris] Worker for {crashed_milestone.id} crashed: {e}", flush=True)
630
+ logger.error("Worker crashed for %s: %s", crashed_milestone.id, e)
631
+ failed_result = ExecutionResult(output=f"Worker crashed: {e}", resolved=False, exit_code=1)
632
+ results.append((crashed_milestone, failed_result))
625
633
 
626
634
  else:
627
635
  # No isolation or single task - original behavior
@@ -633,7 +641,14 @@ def run_parallel(tasks: list, project_dir: str, max_iterations: int = None,
633
641
  with concurrent.futures.ThreadPoolExecutor(max_workers=len(tasks)) as executor:
634
642
  futures = {executor.submit(_run_one, t): t for t in tasks}
635
643
  for future in concurrent.futures.as_completed(futures):
636
- results.append(future.result())
644
+ try:
645
+ results.append(future.result())
646
+ except Exception as e:
647
+ _, crashed_milestone = futures[future]
648
+ print(f" [Boris] Worker for {crashed_milestone.id} crashed: {e}", flush=True)
649
+ logger.error("Worker crashed for %s: %s", crashed_milestone.id, e)
650
+ failed_result = ExecutionResult(output=f"Worker crashed: {e}", resolved=False, exit_code=1)
651
+ results.append((crashed_milestone, failed_result))
637
652
 
638
653
  return results
639
654
 
@@ -2,7 +2,7 @@ from setuptools import setup
2
2
 
3
3
  setup(
4
4
  name="borisxdave",
5
- version="0.3.5",
5
+ version="0.3.6",
6
6
  description="Boris - Autonomous Project Orchestrator",
7
7
  py_modules=["boris", "engine", "git_manager", "prompts", "state", "planner", "config", "file_lock", "boris_prompt_data"],
8
8
  python_requires=">=3.8",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes