Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[Bounty Proposal] fix(backend): one malformed stored message 500s the desktop journal reconcile page ($25-50 proposed)

Closed Beginner friendly
#20,271 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@nguyentruong190 is already working on this.

Since Oct 2, 2026.

  • #20272 by @nguyentruong190 — open
  • #21633 by @yggdrasilworld — open

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
88/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
fastapi, python
Domain
api, backend

Research direction

Start in backend/routers/chat_sessions.py and compare the reconcile handler with the sibling GET /v2/desktop/messages path using Message.deserialize_many_safe. Run backend/tests/unit/test_desktop_messages_reconcile_poison.py first; done means malformed rows are skipped and logged without PII, valid rows remain, and pagination fields survive including on all-poisoned pages.

Written by the indexing model from the issue text.

Description

Summary

GET /v2/desktop/messages/reconcile (the desktop journal sync page) returns raw Firestore dicts into DesktopMessageReconcilePageResponse.messages: list[Message]. Message requires id/text/created_at/sender/type, and get_messages_reconcile_page only filters the reported flag — so one legacy or corrupted stored row makes FastAPI raise ResponseValidationError (HTTP 500) and the desktop client cannot sync its journal until the document is fixed manually.

The sibling endpoint GET /v2/desktop/messages was already hardened against exactly this failure class with Message.deserialize_many_safe; the reconcile path was missed.

Fix

Route the reconcile page through the same guard in backend/routers/chat_sessions.py: malformed rows are skipped and logged non-PII (record id + exception class), valid rows are returned, and next_cursor/has_more pass through untouched so the client can resume the scan even when a page contains only poisoned rows.

Tests

backend/tests/unit/test_desktop_messages_reconcile_poison.py — 9 hermetic unit tests (no network, no services): malformed / missing-text / garbage-typed / non-dict rows are dropped, all-valid pages survive unchanged, pagination fields pass through, next_cursor survives an all-poisoned page, skips are logged, and a structural check keeps both desktop message surfaces on the same deserializer.

Proposed Bounty
  • $25–50 (read-boundary poison-page hardening; same failure class as the earlier desktop-messages guard).

Payout (PayPal): [email protected]

Disclosure: investigation, patch, and tests were prepared with an AI assistant. This proposal does not represent independent human technical review.

Dominant language
Python
Stars
13.7k
Forks
2.6k
Avg merge
6h 32m
Merged PRs (30d)
622

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from BasedHardware/omi

All issues in BasedHardware/omi

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.