Decision Journal ability#259
Open
hassan1731996 wants to merge 10 commits intoopenhome-dev:devfrom
Open
Conversation
Passive background daemon captures significant decisions from natural conversation and stores them with category, alternatives, and significance. Interactive skill enables outcome recording, guided reflection sessions, LLM-synthesized pattern analysis, stale-outcome nudges after 14 days, and daily briefings. Two-phase detection filters trivial and third-party decisions; 60% dedup prevents recapture.
Contributor
🔀 Branch Merge CheckPR direction: ✅ Passed — |
Contributor
✅ Community PR Path Check — PassedAll changed files are inside the |
Contributor
✅ Ability Validation Passed |
Contributor
🔍 Lint Results🔧 Auto-formattedSome files were automatically cleaned and formatted with
✅
|
Use wait_for_complete_transcription() return value as trigger_text in main.py so intent classification sees the actual current utterance — get_full_message_history() does not include the current turn at call time. Move nudge_checked_today and briefed_today flag-setting into finally blocks in background.py so they are always set even when an exception occurs, preventing the stale-nudge and daily-briefing blocks from re-firing on every poll after an error.
1. Sentiment substring collision — _infer_outcome_sentiment now uses whole-word
regex for all single-word keywords so "know" no longer matches "no" → negative,
"yesterday" no longer matches "yes" → positive, etc. Multi-word phrases checked
first as they are unambiguous.
2. Outcome auto-selection — _handle_outcome now requires genuine keyword overlap
between hint and a decision summary before auto-picking. Generic trigger text
("record an outcome") no longer silently selects the first pending item when
multiple decisions exist; the user is asked to pick instead.
3. ADD intent miss — _classify_intent now also catches "add/log + decision" so
"add to my decision journal" routes correctly to ADD instead of falling to LIST.
4. Category inference gap — _handle_add now calls _infer_category(topic) as the
default before asking the user, so the best available category is always set
even when the user exits the category question.
5. Daily flags never reset — background.py tracks s["current_day"] and resets
nudge_checked_today and briefed_today whenever the calendar date changes,
ensuring stale-nudge and daily-briefing fire correctly on day 2+ of long sessions.
The check required both a clear keyword AND 'all' in the text. 'clear my decisions' is a registered hotword but contains no 'all', so it fell through to LIST. Widened the match to also fire when the text contains 'decision' or 'journal', which covers all natural phrasings users would say within this skill.
Bug A — 'add a decision' mid-list routed to explore: _handle_list reply router had no ADD branch so any unrecognised reply fell to _handle_explore. Added ADD routing before the else. Bug B — 'hear another' replayed the same decision: _handle_explore had no awareness of what was just shown so asking for 'another' when only one decision exists looped forever on the same item. Added exclude_id parameter: when the user asks for 'another/different/next', the current decision is excluded from candidates. If nothing remains, a friendly message is spoken and the flow exits cleanly. Bug C — 'clear my decisions' consumed as outcome/reflection answer: Any hotword said while user_response() was waiting was treated as an answer to the open question. Added _intercept_redirect() helper that checks every user_response() reply for clear/add intent before the answer is processed. Also guards the run_io_loop reflection step so a redirect command is never saved as reflection text.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What is Decision Journal?
A passive ability that silently captures the decisions you make in natural conversation — "I decided to take the startup job", "I am going with the Toyota", "I am torn between two offers" — and stores them with rich context.
Just talk naturally. No trigger word needed to log a decision. Then say "decision journal" anytime to review your queue, record how decisions turned out, run a reflective session, or hear patterns in how you decide.
Key Features
Passive Capture
Decision Lifecycle Tracking
Reflection Sessions
Pattern Analysis
Smart Organization
Manual Add
How It Works Under the Hood
background.py (daemon)
main.py (interactive skill)
Testing Verified