Skip to content

v0.37.0 — boot splash + four silent-failure bugs squashed

Choose a tag to compare

@esengine esengine released this 10 May 06:59
· 1942 commits to main-v2 since this release
736e615

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

  • /new destroyed prior transcriptsclearLog was overwriting ~/.reasonix/sessions/code-<project>.jsonl in 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 (sessionName unchanged). (#587, #590)
  • Dashboard hid flat-format skills/api/skills only 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 description silently 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); applySkillsIndex lists 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 flashESCALATION_CONTRACT had deepseek-v4-flash baked into a const interpolated into three system prompts. escalationContract is 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 while SlashSuggestions rendered 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 laggyschedule() 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=plain removed; override via REASONIX_FLUSH_MS=16 for 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. Each runtime.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.addTool hot-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 CardStream and the position indicator. The static ↑ earlier hint is now a live ↑ N / M rows above — K more indicator 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