Upload 14 files
Browse files- src/timeline_model.py +31 -18
- 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 == "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
("
|
| 355 |
-
|
| 356 |
-
("
|
| 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 "
|
| 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.
|
| 4 |
-
ASF_RELEASE_NAME = "Agentic Space Factory v189.
|
| 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:
|