fffiloni commited on
Commit
38e1421
·
verified ·
1 Parent(s): 2fe20a0

Upload 14 files

Browse files
Files changed (2) hide show
  1. src/timeline_model.py +31 -18
  2. src/version.py +2 -2
src/timeline_model.py CHANGED
@@ -305,7 +305,15 @@ def _archive_warning(bundle: dict[str, Any], *, terminal: bool) -> dict[str, Any
305
 
306
  def _build_phase_details(bundle: dict[str, Any], phase: str) -> list[dict[str, Any]]:
307
  details: list[dict[str, Any]] = []
308
- if phase == "live_validation":
 
 
 
 
 
 
 
 
309
  signals = _signals(bundle)
310
  smoke = _smoke(bundle)
311
  if signals.get("health_passed") is True:
@@ -344,22 +352,16 @@ def _build_phase_details(bundle: dict[str, Any], phase: str) -> list[dict[str, A
344
  if not steps.intersection(PHASE_STEPS["recovery"]):
345
  details.append({"label": "Recovery not needed", "status": "skipped"})
346
  else:
347
- failed_steps = {
348
- _lower(e.get("step"))
349
- for e in _events(bundle)
350
- if _lower(e.get("step")) in PHASE_STEPS["recovery"] and _lower(e.get("status")) in FAILED_STATUSES
351
- }
352
- for label, candidates in [
353
- ("Diagnose", {"failure_diagnosis", "pi_diagnosis"}),
354
- ("Decide", {"repair_decision"}),
355
- ("Patch", {"repair", "repair_patch", "repair_upload"}),
356
- ("Revalidate", {"repair_validation"}),
357
- ]:
358
- status = "failed" if failed_steps.intersection(candidates) else "complete" if steps.intersection(candidates) else "pending"
359
- details.append({"label": label, "status": status})
360
- blocker = _final_blocker_label(bundle)
361
- if blocker:
362
- details.append({"label": blocker, "status": "failed"})
363
  else:
364
  latest = _latest_event_for_phase(bundle, phase)
365
  if latest:
@@ -376,6 +378,10 @@ def _phase_summary(bundle: dict[str, Any], phase: str, status: str) -> str:
376
  warning = _hardware_warning(bundle)
377
  if warning:
378
  return warning["label"]
 
 
 
 
379
  if phase == "live_validation":
380
  blocker = _final_blocker_label(bundle)
381
  if blocker and _final_visual_status(_verdict(bundle)) == "error":
@@ -449,10 +455,14 @@ def _phase_status(bundle: dict[str, Any], phase: str, verdict: str) -> str:
449
  return "failed"
450
  return "warning" if terminal else "running"
451
 
 
 
 
 
452
  if phase == "live_validation":
453
  blocker = _final_blocker_label(bundle)
454
  if blocker and _final_visual_status(_verdict(bundle)) == "error":
455
- return "Live validation incomplete"
456
  signals = _signals(bundle)
457
  smoke = _smoke(bundle)
458
  if signals.get("generation_smoke_passed") is True or _lower(smoke.get("status")) == "success":
@@ -473,6 +483,9 @@ def _phase_status(bundle: dict[str, Any], phase: str, verdict: str) -> str:
473
  return "warning" if bundle.get("eval_record") else "pending"
474
  return "pending"
475
 
 
 
 
476
  if phase == "agent" and _pi_model_warning(bundle):
477
  return "warning"
478
  if phase == "hardware" and _hardware_warning(bundle):
 
305
 
306
  def _build_phase_details(bundle: dict[str, Any], phase: str) -> list[dict[str, Any]]:
307
  details: list[dict[str, Any]] = []
308
+ if phase == "deploy":
309
+ blocker = _final_blocker_label(bundle)
310
+ if blocker and _build_error_observation(bundle):
311
+ details.append({"label": blocker, "status": "failed"})
312
+ else:
313
+ latest = _latest_event_for_phase(bundle, phase)
314
+ if latest:
315
+ details.append({"label": str(latest.get("message") or latest.get("step") or PHASE_LABELS[phase]), "status": _lower(latest.get("status")) or "info"})
316
+ elif phase == "live_validation":
317
  signals = _signals(bundle)
318
  smoke = _smoke(bundle)
319
  if signals.get("health_passed") is True:
 
352
  if not steps.intersection(PHASE_STEPS["recovery"]):
353
  details.append({"label": "Recovery not needed", "status": "skipped"})
354
  else:
355
+ failed = any(_lower(e.get("step")) == "repair_validation" and _lower(e.get("status")) in FAILED_STATUSES for e in _events(bundle))
356
+ if failed:
357
+ details.append({"label": "Patch attempted; final blocker remains", "status": "failed"})
358
+ blocker = _final_blocker_label(bundle)
359
+ if blocker:
360
+ details.append({"label": blocker, "status": "failed"})
361
+ elif any(_lower(e.get("step")) == "repair_validation" and _lower(e.get("status")) in SUCCESS_STATUSES for e in _events(bundle)):
362
+ details.append({"label": "Repair revalidated", "status": "complete"})
363
+ else:
364
+ details.append({"label": "Recovery in progress", "status": "running"})
 
 
 
 
 
 
365
  else:
366
  latest = _latest_event_for_phase(bundle, phase)
367
  if latest:
 
378
  warning = _hardware_warning(bundle)
379
  if warning:
380
  return warning["label"]
381
+ if phase == "deploy":
382
+ blocker = _final_blocker_label(bundle)
383
+ if blocker and _build_error_observation(bundle):
384
+ return blocker
385
  if phase == "live_validation":
386
  blocker = _final_blocker_label(bundle)
387
  if blocker and _final_visual_status(_verdict(bundle)) == "error":
 
455
  return "failed"
456
  return "warning" if terminal else "running"
457
 
458
+ if phase == "deploy":
459
+ blocker = _final_blocker_label(bundle)
460
+ if blocker and _build_error_observation(bundle):
461
+ return "failed"
462
  if phase == "live_validation":
463
  blocker = _final_blocker_label(bundle)
464
  if blocker and _final_visual_status(_verdict(bundle)) == "error":
465
+ return "failed"
466
  signals = _signals(bundle)
467
  smoke = _smoke(bundle)
468
  if signals.get("generation_smoke_passed") is True or _lower(smoke.get("status")) == "success":
 
483
  return "warning" if bundle.get("eval_record") else "pending"
484
  return "pending"
485
 
486
+ if phase == "deploy" and _build_error_observation(bundle):
487
+ return "failed"
488
+
489
  if phase == "agent" and _pi_model_warning(bundle):
490
  return "warning"
491
  if phase == "hardware" and _hardware_warning(bundle):
src/version.py CHANGED
@@ -1,7 +1,7 @@
1
  from __future__ import annotations
2
 
3
- ASF_APP_VERSION = "v189.7"
4
- ASF_RELEASE_NAME = "Agentic Space Factory v189.7"
5
 
6
 
7
  def resolve_app_version(value: str | None = None) -> str:
 
1
  from __future__ import annotations
2
 
3
+ ASF_APP_VERSION = "v189.9"
4
+ ASF_RELEASE_NAME = "Agentic Space Factory v189.9"
5
 
6
 
7
  def resolve_app_version(value: str | None = None) -> str: