From 1a9ff78b1c678341faf97a791413ca78a793f348 Mon Sep 17 00:00:00 2001 From: kimi Date: Fri, 20 Mar 2026 17:09:10 -0400 Subject: [PATCH] refactor: break up self_reflect into helpers Extract _format_recurring_topics() and _build_reflection_report() from self_reflect(), reducing it from 67 lines to 18. No behavior change. Fixes #640 Co-Authored-By: Claude Opus 4.6 --- src/timmy/session_logger.py | 76 ++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/src/timmy/session_logger.py b/src/timmy/session_logger.py index 374a023..09a192b 100644 --- a/src/timmy/session_logger.py +++ b/src/timmy/session_logger.py @@ -392,31 +392,26 @@ def _build_insights( return insights or ["Conversations look healthy. Keep up the good work."] -def self_reflect(limit: int = 30) -> str: - """Review recent conversations and reflect on Timmy's own behavior. +def _format_recurring_topics(repeated: list[tuple[str, int]]) -> list[str]: + """Format the recurring-topics section of the reflection report.""" + if repeated: + lines = ["### Recurring Topics"] + for word, count in repeated: + lines.append(f'- "{word}" ({count} mentions)') + lines.append("") + return lines + return ["### Recurring Topics\nNo strong patterns detected.\n"] - Scans past session entries for patterns: low-confidence responses, - errors, repeated topics, and conversation quality signals. Returns - a structured reflection that Timmy can use to improve. - Args: - limit: How many recent entries to review (default 30). - - Returns: - A formatted self-reflection report. - """ - sl = get_session_logger() - sl.flush() - entries = sl.get_recent_entries(limit=limit) - - if not entries: - return "No conversation history to reflect on yet." - - _messages, errors, timmy_msgs, user_msgs = _categorize_entries(entries) - low_conf = _find_low_confidence(timmy_msgs) - repeated = _find_repeated_topics(user_msgs) - - # Build reflection report +def _build_reflection_report( + entries: list[dict], + errors: list[dict], + timmy_msgs: list[dict], + user_msgs: list[dict], + low_conf: list[dict], + repeated: list[tuple[str, int]], +) -> str: + """Assemble the full self-reflection report from analysed data.""" sections: list[str] = ["## Self-Reflection Report\n"] sections.append( f"Reviewed {len(entries)} recent entries: " @@ -446,16 +441,37 @@ def self_reflect(limit: int = 30) -> str: ) ) - if repeated: - sections.append("### Recurring Topics") - for word, count in repeated: - sections.append(f'- "{word}" ({count} mentions)') - sections.append("") - else: - sections.append("### Recurring Topics\nNo strong patterns detected.\n") + sections.extend(_format_recurring_topics(repeated)) sections.append("### Insights") for insight in _build_insights(low_conf, errors, repeated): sections.append(f"- {insight}") return "\n".join(sections) + + +def self_reflect(limit: int = 30) -> str: + """Review recent conversations and reflect on Timmy's own behavior. + + Scans past session entries for patterns: low-confidence responses, + errors, repeated topics, and conversation quality signals. Returns + a structured reflection that Timmy can use to improve. + + Args: + limit: How many recent entries to review (default 30). + + Returns: + A formatted self-reflection report. + """ + sl = get_session_logger() + sl.flush() + entries = sl.get_recent_entries(limit=limit) + + if not entries: + return "No conversation history to reflect on yet." + + _messages, errors, timmy_msgs, user_msgs = _categorize_entries(entries) + low_conf = _find_low_confidence(timmy_msgs) + repeated = _find_repeated_topics(user_msgs) + + return _build_reflection_report(entries, errors, timmy_msgs, user_msgs, low_conf, repeated)