Clarify claim completion metrics

This commit is contained in:
Himanshu Dongre 2026-05-17 23:57:35 +05:30
parent eb60d03f4b
commit ab8d6f6b6f
4 changed files with 39 additions and 2 deletions

View file

@ -37,6 +37,7 @@ class CoordinationMetrics(BaseModel):
total_claims: int = 0
claims_done: int = 0
claims_abandoned: int = 0
claims_unresolved: int = 0
claims_with_task_id: int = 0
claim_completion_rate: Optional[float] = None
@ -134,6 +135,7 @@ def get_space_metrics(space_id: uuid.UUID, db: Session = Depends(get_db)):
)
cl_row = db.execute(claim_stmt).one()
total_resolved = cl_row.done + cl_row.abandoned
unresolved = max(cl_row.total - total_resolved, 0)
completion_rate = round(cl_row.done / total_resolved, 2) if total_resolved > 0 else None
coordination = CoordinationMetrics(
@ -144,6 +146,7 @@ def get_space_metrics(space_id: uuid.UUID, db: Session = Depends(get_db)):
total_claims=cl_row.total,
claims_done=cl_row.done,
claims_abandoned=cl_row.abandoned,
claims_unresolved=unresolved,
claims_with_task_id=cl_row.with_task_id,
claim_completion_rate=completion_rate,
)

View file

@ -56,6 +56,7 @@ def test_metrics_empty_space(client):
assert data["coordination"]["total_checkpoints"] == 0
assert data["coordination"]["unique_agents"] == 0
assert data["coordination"]["total_claims"] == 0
assert data["coordination"]["claims_unresolved"] == 0
assert data["state_quality"]["avg_decisions_per_checkpoint"] == 0.0
assert data["branches"]["active"] == 0
@ -127,6 +128,7 @@ def test_metrics_claim_stats(client):
assert data["coordination"]["total_claims"] == 3
assert data["coordination"]["claims_done"] == 1
assert data["coordination"]["claims_abandoned"] == 1
assert data["coordination"]["claims_unresolved"] == 1
assert data["coordination"]["claims_with_task_id"] == 1
# Completion rate: 1 done / (1 done + 1 abandoned) = 0.5
assert data["coordination"]["claim_completion_rate"] == 0.5

View file

@ -924,10 +924,22 @@ def format_metrics(data: dict) -> str:
parts.append(f"{cross} cross-agent continuation{'s' if cross != 1 else ''}")
claims_total = coord.get("total_claims", 0)
claims_done = coord.get("claims_done", 0)
claims_abandoned = coord.get("claims_abandoned", 0)
resolved_claims = claims_done + claims_abandoned
unresolved_claims = coord.get("claims_unresolved")
if unresolved_claims is None:
unresolved_claims = max(claims_total - resolved_claims, 0)
rate = coord.get("claim_completion_rate")
rate_str = f"{int(rate * 100)}% completion" if rate is not None else "no claims resolved"
if rate is not None:
rate_str = f"{resolved_claims} resolved ({int(rate * 100)}% done)"
else:
rate_str = f"{resolved_claims} resolved"
task_id_claims = coord.get("claims_with_task_id", 0)
parts.append(f"{claims_total} claims · {rate_str} · {task_id_claims} with task IDs")
parts.append(
f"{claims_total} claims · {rate_str} · "
f"{unresolved_claims} unresolved · {task_id_claims} with task IDs"
)
parts.append("")
# State quality

View file

@ -17,6 +17,7 @@ def test_format_metrics_omits_empty_agent_distribution():
assert "0 checkpoints · 0 agents\n" in out
assert "0 agents ()" not in out
assert "0 claims · 0 resolved · 0 unresolved · 0 with task IDs" in out
def test_format_metrics_names_checkpoint_task_counts():
@ -31,3 +32,22 @@ def test_format_metrics_names_checkpoint_task_counts():
})
assert "5 checkpoints with structured tasks · 5 checkpoints with task IDs" in out
def test_format_metrics_claim_completion_names_resolved_denominator():
out = format_metrics({
"space_name": "claims",
"coordination": {
"total_claims": 3,
"claims_done": 2,
"claims_abandoned": 0,
"claims_unresolved": 1,
"claim_completion_rate": 1.0,
"claims_with_task_id": 2,
},
"state_quality": {},
"branches": {},
})
assert "3 claims · 2 resolved (100% done) · 1 unresolved · 2 with task IDs" in out
assert "100% completion" not in out