refactor: Unify canonical task outcome statuses (completed, skipped) across workflow and memory services (Closes #384)

This commit is contained in:
ajaysi
2026-03-07 12:00:04 +05:30
parent 5780deff2f
commit a00212ca4d
3 changed files with 6 additions and 5 deletions

View File

@@ -191,7 +191,7 @@ async def set_task_status(
memory = TaskMemoryService(user_id, db) memory = TaskMemoryService(user_id, db)
await memory.record_task_outcome( await memory.record_task_outcome(
task, task,
feedback_score=1 if status == "completed" else -1 if status == "dismissed" else 0, feedback_score=1 if status == "completed" else -1 if status in ("dismissed", "skipped") else 0,
feedback_text=completion_notes feedback_text=completion_notes
) )
except Exception as e: except Exception as e:
@@ -210,7 +210,7 @@ async def set_task_status(
"pillarId": task.pillar_id, "pillarId": task.pillar_id,
"title": task.title, "title": task.title,
"description": task.description, "description": task.description,
"status": "skipped" if task.status == "dismissed" else task.status, "status": "skipped" if task.status in ("dismissed", "skipped") else task.status,
} }
asyncio.create_task(_index_tasks_to_sif(user_id, plan_date, [task_payload], label="today")) asyncio.create_task(_index_tasks_to_sif(user_id, plan_date, [task_payload], label="today"))
@@ -220,7 +220,7 @@ async def set_task_status(
"task": { "task": {
"id": str(task.id), "id": str(task.id),
"pillarId": task.pillar_id, "pillarId": task.pillar_id,
"status": "skipped" if task.status == "dismissed" else task.status, "status": "skipped" if task.status in ("dismissed", "skipped") else task.status,
"decided_at": task.decided_at.isoformat() if task.decided_at else None, "decided_at": task.decided_at.isoformat() if task.decided_at else None,
} }
}, },

View File

@@ -15,7 +15,7 @@ from services.intelligence.txtai_service import TxtaiIntelligenceService
EXACT_DUPLICATE_LOOKBACK_DAYS = 7 EXACT_DUPLICATE_LOOKBACK_DAYS = 7
SEMANTIC_SUPPRESSION_SCORE_THRESHOLD = 0.85 SEMANTIC_SUPPRESSION_SCORE_THRESHOLD = 0.85
SUPPRESSED_STATUSES = {"dismissed", "rejected"} SUPPRESSED_STATUSES = {"dismissed", "rejected", "skipped"}
class TaskMemoryService: class TaskMemoryService:
""" """
@@ -72,7 +72,7 @@ class TaskMemoryService:
self.db.commit() self.db.commit()
# 2. Index into txtai (if status is meaningful) # 2. Index into txtai (if status is meaningful)
if task.status in ["completed", "dismissed", "rejected"]: if task.status in ["completed", "dismissed", "rejected", "skipped"]:
# We index the task text with metadata about its outcome # We index the task text with metadata about its outcome
# This allows us to search: "Has the user rejected similar tasks?" # This allows us to search: "Has the user rejected similar tasks?"
doc = { doc = {

View File

@@ -25,6 +25,7 @@ def _coerce_priority(value: Any) -> str:
def _coerce_status(value: Any) -> str: def _coerce_status(value: Any) -> str:
v = str(value or "pending").lower().strip() v = str(value or "pending").lower().strip()
if v in {"pending", "in_progress", "completed", "skipped", "dismissed"}: if v in {"pending", "in_progress", "completed", "skipped", "dismissed"}:
# Canonicalize 'dismissed' to 'skipped' for consistency
return "skipped" if v == "dismissed" else v return "skipped" if v == "dismissed" else v
return "pending" return "pending"