Repository navigation
Conversation
A tool result part holding a NUL byte made tera_render panic (NulError at src/lib.rs:135) and the panic cannot unwind, so the whole dev server aborted: twice on 2026-10-21, 13:57 and 13:58, about 60 s after each boot when blocks_refresh posted the parsed view over the transcripts. The join never needed a template; array_to_string gives the same text (checked on multi-line, quoted, unicode and empty parts) and keeps the NUL. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
duckstack/review: error The review did not start; the next tick starts it again. Dev's answer: Invalid Input Error: Pipe process exited abnormally code=1: cd '/Users/aloksubbarao/.duck/deploy' && PR_BASE=$(git -C /Users/aloksubbarao/duckdb-skills merge-base origin/main d79b5c9) PR_REPO='/Users/aloksubbarao/duckdb-skills' PR_GH='/opt/homebrew/bin/gh' PR_GH_REPO Opus 5.5, duckstack review queue (duckstack-review skill) |
|
Closed on Alok's decision: the NUL byte came from an agent reading a binary file (pdf.duckdb_extension.info) with cat into its transcript. The fix is that agents read binary files with read_blob, never as text; not a change to this join. — Claude Fable 5.1 |
|
Reopened on Alok's call: no DuckDB reader breaks on a NUL byte (read_json, read_csv and array_to_string all carry it, tested); only the tera_render join in blocks.sql aborts the server on it. The query is the fault. — Claude Fable 5.1 |
|
duckstack/review: failure
Opus 5.5, duckstack review queue (duckstack-review skill) |
|
Closed as a duplicate of #101, which strips the NUL with replace(…, chr(0), '') as Alok said. — Claude Fable 5.1 |
Why
Dev aborted twice on 2026-10-21 (13:57 and 13:58), each time about 60 s after boot, while
blocks_refreshposted the parsed view over the transcripts. The server log showsTeraRenderFuncunder a CASE in a projection, thenpanicked at src/lib.rs:135:50 … NulErrorandthread caused non-unwinding panic. aborting.The cause isserver/blocks.sqlline 50: it joined a tool result's text parts withtera_render('{{ parts | join(sep="\n") }}', …). A part with a NUL byte kills the server; the template never did anything a list join does not.Change
One expression:
array_to_string(text_parts, chr(10))in place of the tera join. The comment names the reason.Tested
Local
duckdb :memory:with the tera extension loaded:tera_renderon['a', 'b' || chr(0) || 'c']→NulError(3, [97, 10, 98, 0, 99]), process exit 134.array_to_stringon the same list → 5 chars, NUL kept.tera_render(...) = array_to_string(parts, chr(10))is true for['a','b'], a multi-line part with a quoted part,['é', '']and['one'].🤖 Generated with Claude Code