tee_to_pipe declared the transchan 'clear' op; the Tcl core delivers 'clear'
before every write when declared (the G-145 defect class - see
goals/archive/G-145-piped-usage-ansi-remnants.md) and the handler discarded
o_encbuf, the held partial multi-byte character. The following chunk then began
with orphan continuation bytes and could never decode (the tail-backoff only
trims the end), so whole chunks accumulated in o_encbuf and successive clears
discarded them - eating contiguous multi-KB ranges of multibyte-dense output on
the unix repl console stack: 'i <cmd>' help tables displayed with missing
paragraphs, fused mid-word seam lines, or truncated bottom rows (WSL and native
linux ttys; windows unaffected). Isolation repro: 393/600 lines lost with
clear-per-write vs 0/600 without.
- tee_to_pipe: 'clear' no longer declared in initialize, so the core never
delivers it (same shape as the G-145 fix in ::punkboot::ansistrip); the
method is kept as a state-preserving no-op with a warning comment.
- flush repaired in tee_to_pipe, tee_to_log and logonly: all three referenced
an undeclared o_buffered variable (copy-paste from the o_buffered-bearing
ansiwrap/ansistrip classes) and threw on every invocation. Each now holds an
undecodable partial char in o_encbuf for the next write and emits any
decodable remainder per its class semantics.
- Verified: transform isolation harnesses clean at all chunk sizes with
clear-per-write; WSL end-to-end (linux kit visitor mode on a script(1) pty)
shows all previously-missing define/list table content present;
'make.tcl modules' mint OK.
- shellfilter-buildversion 0.2.4 -> 0.2.5; punkproject 0.49.3 -> 0.49.4 with
CHANGELOG entry; G-090 Context records the finding as audit evidence (no
characterization tests exist yet for these transforms - G-090 scope).
Claude-Session: https://claude.ai/code/session_01QgaxV27VZkmEec7oNbEVFc
Assisted-by: harness=claude; primary-model=claude-fable-5; api-location=anthropic.com