Skip to content

0.0.3 runtime audit

Follow-up to release readiness, covering PR #98 and issues #59, #72 and #74. Rendering reference: Python rich 15.0.0. CLI semantics reference: rich-cli 1.8.1.

Finding Disposition and verification
#98 escape boundaries lose suffix bytes Recalculate from each actual break. Feature tests preserve every ASCII byte at widths 1–20 and reject partial cropped escapes.
#98 unconditional core divergence Off-default json-escape-safe feature. Library requires .escape_safe(true); default goldens are real Python output. CLI feature opts in.
#59 / #72 piped GIF animation One first frame, no delay/control codes, even --loop 0; CLI diagnostic. Unit and process-timeout tests cover single/composed frames.
#72 ignored GIF flags Reject decorators/alignment/pager and exports for explicit or inferred GIF paths; mode conflict names include GIF/diff.
#72 image auto downgrade Emit stderr diagnostic when auto resolves to ASCII; explicit fallbacks retain their diagnostics.
#72 notebook outputs Streams remain unlabelled; ignore display_data like pinned upstream (including PNG), without a spurious Out label. Adding image placeholders would be an extension.
#72 syntax and notebook tabs Existing four-space syntax expansion retained; existing syntax tests and CLI suite pass.
#72 JSON/CSV/syntax alignment Existing alignment works; tests exercise all three. Multiple flags now follow upstream left > right > center priority independent of order.
#72 rule truncation/decorators Existing ellipsis and decorator behavior retained; refusing rule decorators would break functional flags.
#72 nested lists, strike, code-only list item Existing fixes retained. Code-only item starts with a padding row; regression matches pinned Python.
#72 missing pager Existing unpaged fallback matches pinned upstream. No new diagnostic divergence introduced.
#74 JSON integers / exponents Preserve all integer digits; normalize -0; overflowing positive/negative exponent values render signed Infinity. Python golden and malformed-number tests.
#74 JSON depth / NaN Existing iterative parser accepts deep inputs and non-finite literals; retained tests.
#74 CSV memory Stream styled rows for undecorated CSV; retain source rows for measurement. Decorators, alignment, paging and exports still buffer. See measured evidence below.
#74 emoji widths, code padding, nested padding Existing grapheme-aware widths and container/code padding retained; core tests and goldens pass.
#74 Markdown images / quoted rules / HTML / empty files Adjacent same-cell images share a row; quoted-rule and ignored-HTML spacing match Python; empty Markdown emits zero bytes. Seven new Python goldens.
#74 narrow panels Widths 2–4 already omit content. Pinned upstream ForceWidth also permits two corners at requested width 1 in a wider console; retained parity.
#74 docs Shipped perceptual example says 5.4%; redirected Sixel fallback correctly described as ASCII.
#74 long-line performance note No correctness defect claimed; wrapping optimization remains separate work.

The same-host debug-build benchmark used 10 columns, 10,000 rows, a 1,300,080-byte file, COLUMNS=100 and stdout redirected to /dev/null. Peak RSS fell from 236,008 KiB to 24,656 KiB; elapsed time from 5.31 s to 2.27 s. These are measurements of this fixture, not a constant-memory guarantee. Source rows still scale with input. See the repository's .github/evidence/v0.0.3-runtime/ for commands, outputs and actual CLI screenshots.

Further checks of older reports are recorded in the remaining UAT audit.