← Files Fitness LedgerARCHIVED FILE

skills/nutrition-ledger/scripts/debt.py

1.8 KB · Sep 30, 2026 · 23:15 UTC

↓ Download file

"""Transparent food-master data-debt prioritization."""

from __future__ import annotations

from collections import Counter
from datetime import datetime, timezone
from typing import Any, Iterable, Mapping


def prioritize_food_master_debt(masters: Iterable[Mapping[str, Any]], entries: Iterable[Mapping[str, Any]], *, now: datetime | None = None) -> list[dict[str, Any]]:
    entries = [e for e in entries if not e.get("deleted_at")]
    usage = Counter(e.get("food_master_id") for e in entries)
    calories = Counter()
    for e in entries:
        if e.get("food_master_id") and e.get("calories") is not None:
            calories[e["food_master_id"]] += float(e["calories"])
    current = now or datetime.now(timezone.utc)
    result = []
    for master in masters:
        mid = master.get("food_master_id")
        nutrient_values = master.get("nutrients") or master
        unknown = sum(value is None for key, value in nutrient_values.items() if key.endswith(("_mg", "_mcg", "_g")))
        stale = 1.0 if not master.get("last_verified_at") else 0.0
        if master.get("last_verified_at"):
            try:
                stamp = datetime.fromisoformat(str(master["last_verified_at"]).replace("Z", "+00:00"))
                if stamp.tzinfo is None: stamp = stamp.replace(tzinfo=timezone.utc)
                stale = 1.0 if (current - stamp).days > 180 else 0.0
            except ValueError:
                stale = 1.0
        score = (1 + usage[mid]) * (1 + unknown) * (1 + stale)
        result.append({"food_master_id": mid, "priority": round(score, 4), "usage_frequency": usage[mid], "calorie_contribution": round(calories[mid], 2), "unknown_nutrients": unknown, "stale_verification": bool(stale)})
    return sorted(result, key=lambda row: (-row["priority"], str(row["food_master_id"])))

SHA-256: c2dad74fe5e79ba97073bc16e14a18cfd12b185afdbc5767d8bd2f3f7dfbfe47