Compute a deterministic memory hygiene score with findings #292
Description
See #290, section 4. Compute a 0–100 score per project from structure and timestamps only, without an LLM, and always return the findings that name the items.
Work
- Start with the findings that need no new data: crowded top level, long summary, expired but not archived, old memories of type
task, old session summaries, duplicate or strongly overlapping normalized titles. - Leave extension points for stale bags, lopsided bags and too many critical memories; the weight and bag subtasks add them.
- Show score and findings in the project overview; add one line to
memory_recall(Hygiene 58/100 • …). - Thresholds as named constants; document them on #290.
Acceptance
- Unit tests per finding, including the boundary of each threshold.
- Findings and counts include only memories the reader may see; no private titles leak through recall or the overview.
- The score is stable: the same data always yields the same score and order of findings.