[Bounty Proposal] fix(backend): one malformed stored message 500s the desktop journal reconcile page ($25-50 proposed)
Maintainers usually reply within 1 day
@nguyentruong190 is already working on this.
Since Oct 2, 2026.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 88/100
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
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from BasedHardware/omi
-
Python CLI: corrupt compressed responses hide an unknown write outcomePossibly taken @pranav440 claimed this 4 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
BasedHardware/omi#21295 · 1 comment ·
Maintainers usually reply within 1 day
-
chore(gateway): emit INFO budget reserved/settled logs for proactivity v2 (chip task_2855f4ec)Possibly taken @india3Eth claimed this 9 days ago. Openbackend
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
BasedHardware/omi#20940 · 1 comment ·
Maintainers usually reply within 1 day
-
Ray-Ban Meta: a failed audio start is swallowed and capture shows recording with no audioPossibly taken A pull request linked to this issue is open or already merged. Openbug capture flutter p1
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
BasedHardware/omi#20782 · 1 comment ·
Maintainers usually reply within 1 day
-
[Bug]: Memory non-active routes lack blank string validation and timezone normalizationPossibly taken @brandonstensby-dotcom claimed this 16 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
BasedHardware/omi#20084 ·
Maintainers usually reply within 1 day
-
[Bug]: Memory apply store lacks identifier validation and deletion receipt limit clampingPossibly taken @brandonstensby-dotcom claimed this 16 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
BasedHardware/omi#20075 ·
Maintainers usually reply within 1 day
All issues in BasedHardware/omi
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
ok-oldking/ok-wuthering-waves#1785 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
healthchecks/healthchecks#1349 ·
-
deployment release-lag
Difficulty 1/5 Under an hour Newbie friendliness 68/100
nolte/kamerplanter#2374 ·
Maintainers usually reply within 1 day
-
bug v1 v2
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
modelcontextprotocol/python-sdk#3725 ·
Maintainers usually reply within 1 day
-
batchterms() drops queries without a similar() clause, misaligning results with inputsPossibly taken @MohammadHijjawi97 claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
Maintainers usually reply within 1 day