Stability fixes batch — tech debt review 2026-04-29
Critical:
- Concurrent WS run race guard (#1)
- Tool task cancellation on generator teardown (#2)
- StopAsyncIteration kills fallback chain (#3)
- Session loading race with _lastLoadId guard (#4)
- ContentCard .match() crash on non-string result (#5)
- Image data type guard in buildMessageList (#6)

High:
- Cap WS replay buffer at 500 events (#7)
- Deduplicate memory extraction task with asyncio.Lock (#9)
- TTL-based fallback blacklisting (5 min) (#10)
- Subagent tool exception isolation (#11)
- Inline image size/count validation on WS (#12)
- Clean up orphaned file on DB insert failure (#13)
- Deep watch streamingMsg for auto-scroll (#14)
- WS_SCHEME wss:// support for HTTPS (#15)
- Sending guard against duplicate message sends (#16)
- Global unhandledrejection listener in API layer (#17)

Medium:
- Cap planning_logs at 20 entries (#22)
- Store cleanup_loop task reference (#23)
- BaseException → Exception in _run_with_sentinel (#24)
- Propagate SystemExit in agent loop (#25)
- Configurable output_reserve_tokens (#26)
- Always reloadSession on session_sync (#30)
- FIFO queue for confirm dialogs (#31)
- Reset body.overflow on ImageLightbox unmount (#32)
- try/finally in fallback copy (#33)
- _isConnecting guard in WS send() (#34)

Low:
- Lazy-init deps.py singletons (#36)
- Replace __import__ with direct imports (#38)
- Preserve token count 0 in ollama.py (#39)
- Clear orphaned streamingMsg on reconnect reload (#43)
- Escape single quote in UserMessage (#44)
- Polyfill-free findLast replacement (#48)
- Match <table> tags with attributes in markdown (#49)
- Attach copy buttons only when msg.done (#50)
- Fix hasMeta falsy-0 bug (#53)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent c6ad794 commit 098401aada6517519dc83f57161f459e4362a5e5
@Eugene Sukhodolskiy Eugene Sukhodolskiy authored on 29 Apr
Showing 30 changed files
View
docs/tech_debt_review_2026-04-29.md 0 → 100644
View
navi/api/deps.py
View
navi/api/routes/health.py
View
navi/api/routes/sessions.py
View
navi/api/websocket.py
View
navi/config.py
View
navi/content_store.py
View
navi/core/agent.py
View
navi/llm/base.py
View
navi/llm/fallback.py
View
navi/llm/ollama.py
View
navi/main.py
View
navi/memory/store.py
View
webclient/dist/assets/index-2iU8ea7y.css 100644 → 0
View
webclient/dist/assets/index-CCd1kKp-.css 0 → 100644
View
webclient/dist/assets/index-D9ibLFCS.js 0 → 100644
Not supported
View
webclient/dist/assets/index-P1GIOxAT.js 100644 → 0
Not supported
View
webclient/dist/index.html
View
webclient/src/api/index.js
View
webclient/src/components/chat/InputBar.vue
View
webclient/src/components/chat/MessageList.vue
View
webclient/src/components/messages/AssistantMessage.vue
View
webclient/src/components/messages/ContentCard.vue
View
webclient/src/components/messages/UserMessage.vue
View
webclient/src/components/ui/ImageLightbox.vue
View
webclient/src/composables/useConfirm.js
View
webclient/src/composables/useCopy.js
View
webclient/src/composables/useMarkdown.js
View
webclient/src/composables/useWebSocket.js
View
webclient/src/stores/chat.js