refactor: Unify canonical task outcome statuses (completed, skipped) across workflow and memory services (Closes #384)
This commit is contained in:
@@ -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,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user