Without this Claude has no grounding for "heute"/"morgen"/"naechste
Woche" and only understands dates the user states explicitly.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V57jSQPqwkGG8BuAXg59X5
Root cause: PUT .../cards/{id} requires 'owner' in the body (undocumented
in the Deck API reference used for the original design) - update_order
only sent title/description/type/order/duedate, so every edit 400'd with
"owner must be provided and must be not empty". Reproduced and verified
against the live Nextcloud instance before fixing.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V57jSQPqwkGG8BuAXg59X5
Root cause: get_messages() returns history ending with the just-saved
assistant reply, but the Anthropic Messages API rejects any request whose
last message is not role=user - this failed on every single chat turn in
production, silently swallowed by the existing try/except.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V57jSQPqwkGG8BuAXg59X5
Add upsert_conversation_summary() and search_similar_conversation_summaries()
functions to manage conversation summaries with vector embeddings. These helpers
support cross-chat memory retrieval and background summarization tasks.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iZMEPk2Kt1UC96Lo9bC5w
Document why psycopg2 mocking is necessary in local test environment:
- psycopg2-binary cannot be installed on Python 3.14 (no Wheel)
- main.py imports psycopg2 at module level
- pg_pool only used at runtime, not during import, so mocking is safe
- Docker test environment (JARVIS_HANDOFF.md) has psycopg2-binary available
Also ensures test_memory.py matches pattern of other test files
while explaining the necessary deviation for local test execution.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iZMEPk2Kt1UC96Lo9bC5w
Corrects migrations/006_memory.sql -> Claude outputs/migrations/006_memory.sql
throughout (matches the existing local convention where 002-005 live).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iZMEPk2Kt1UC96Lo9bC5w
Was never committed before. Tracking it now (unmodified) so Task 6 of
the cross-chat-memory plan, which edits this file, produces a clean
incremental diff instead of showing the whole file as new.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iZMEPk2Kt1UC96Lo9bC5w
Matches the existing local convention (002-005 already live there) -
the plan/spec text mistakenly said top-level migrations/.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iZMEPk2Kt1UC96Lo9bC5w
Implement four async DB-helper functions for memory_facts table:
- insert_memory_fact(user_id, content) -> int
- search_memory_facts(query) -> list
- delete_memory_fact(fact_id) -> None
- get_all_memory_facts() -> list
Add test_memory.py with 4 passing tests for these helpers.
All tests pass with mocked db_query.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iZMEPk2Kt1UC96Lo9bC5w
Add two new tables for cross-chat memory feature:
- memory_facts: stores explicit user-provided facts (user_id, content, created_at)
- conversation_summaries: stores conversation summaries with vector embeddings for similarity search
This migration prepares the database schema for Task 2-7 of the cross-chat memory feature plan.
No indexes yet (sequential scan sufficient for expected data volume).
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iZMEPk2Kt1UC96Lo9bC5w