Boot splash + zh-CN status bar, MCP-handshake stall on launch is gone, card virtualization keeps long sessions snappy, and a sweep of four field-reported "silent failure" bugs.
Fixes
/newdestroyed prior transcripts —clearLogwas overwriting~/.reasonix/sessions/code-<project>.jsonlin place, so the Sessions tab only ever showed the latest run and earlier turns vanished without warning. Now archives the live jsonl + sidecars to<name>__archive_<ts>so the conversation survives in the dashboard. Cache-first prefix invariant preserved (sessionNameunchanged). (#587, #590)- Dashboard hid flat-format skills —
/api/skillsonly walked<dir>/<name>/SKILL.md; flat-format skills (<dir>/<name>.md) ran fine from/skill <name>but the dashboard tab was silently empty. Listing now resolves both layouts; read / save / delete share the same resolver. (#586, #589) - Skills missing
descriptionsilently disappeared — install reported success, current session worked, next session claimed the skill didn't exist. Two-layer fix: install POST validates frontmatter (400 instead of writing a phantom skill);applySkillsIndexlists blank-description skills with a placeholder so the model can name them and explain how to fix it. (#583, #591) - Pro session self-reported as flash —
ESCALATION_CONTRACThaddeepseek-v4-flashbaked into a const interpolated into three system prompts.escalationContractis now a function: pro tier gets a no-op contract (it can't escalate to itself), other tiers get the contract with the real model id and an explicit "answer<id>if asked which model you are" line. (#582, #592) - Slash menu drew through WelcomeBanner — pressing
/on the empty home screen left the bordered welcome card mounted whileSlashSuggestionsrendered below; both shared the same flex column, frame buffer interleaved them, card border drew through the menu rows. Welcome card now yields when slash menu opens. (#594) - Wheel-up felt laggy —
schedule()was trailing-edge so every tick paid a 16ms timer before any visual feedback. Now leading-edge; first delta lands immediately. Wheel/PgUp/PgDn step bumped 3 → 8 rows. (#571) - Frame-flush bobbing on winpty / MINTTY / ConEmu / tmux / SSH — 16ms (60Hz) couldn't atomically swap the cursor-up rewrite, previous frame's bottom rows briefly bled through every redraw. Default is now 50ms (20Hz); still reads as continuous streaming.
REASONIX_UI=plainremoved; override viaREASONIX_FLUSH_MS=16for terminals with atomic frame swap. (#570)
Features
- Boot splash for
reasonix code/reasonix chat— cold launch used to flash the alt-screen blank for a few hundred ms before AppInner's first paint completed; users read that as a freeze. Splash holds for one whale-spout cycle (~1.4s) so the wordmark lands cleanly and AppInner's heavy first-paint cost (~150 hooks + several disk reads) hides under it. ANSI Shadow block letters in brand color; three-tone shaded whale silhouette with a 7-frame spout cycle. Setup screen and SessionPicker bypass the splash. (#588) - i18n: status bar + composer + edit-mode hints — final pieces of the chat surface that were still hardcoded English (turn / cache / spent / left / slow / disconnect labels in StatusRow, the "ask anything..." placeholder and "⏎ send · ^C quit" hint in PromptInput, the REVIEW / AUTO / YOLO mode label in LiveRows) now route through
t()with zh-CN coverage. (#584)
Perf
- MCP bridging deferred to App.tsx mount — moved from
chatCommand's pre-render serial loop to a background mount-time effect. Eachruntime.addSpec(raw)handshake is 100ms-2s; users with several servers configured used to watch a black alt-screen until the last one finished. UI now paints immediately, MCP lifecycle events surface as in-app toasts,loop.prefix.addToolhot-adds tools as they bridge — first turn is one cache-miss, same as/mcp browse install. (#585) - Card virtualization — Yoga used to lay out every card in CardStream's inner Box on every scroll tick; for a 50-card history that's hundreds of rows re-measured per tick. Each card now reports its measured height to the chat-scroll store and CardStream collapses off-viewport ranges into a spacer Box, so only ~5-10 cards under the viewport (± 30-row buffer) go through Yoga per scroll. Streaming and freshly-mounted cards always render live for measurement. (#574)
- Chat scroll state isolated from App.tsx — wheel/arrow ticks no longer re-render AppInner's 3,800 lines / 122 hooks per tick; only
CardStreamand the position indicator. The static↑ earlierhint is now a live↑ N / M rows above — K moreindicator that briefly highlights on each delta. (#573)
Install
npm install -g reasonix@0.37.0
# or via npx
npx reasonix@0.37.0
Full changelog: https://github.com/esengine/DeepSeek-Reasonix/blob/main/CHANGELOG.md