build(chat): consume partial-markdown 0.5.3 — streaming table body rows#744
Conversation
Projection-only optimisticBlock branch: while a table is active, a partial open-line row appends as a streaming body row instead of closing the table and flickering as a paragraph / spurious 2nd table. Bare "|" projects as an empty in-progress row. Chrome MCP live verification is a required gate. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6 tasks: cacheplane body-row projection branch (TDD) + 0.5.3 release (PR→tag→OIDC), then libs/chat consume with a body-row anti-flicker test, a REQUIRED Chrome MCP live-stream verification gate, and merge on green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Claude finished @blove's task in 2m 33s —— View job Code Review
SummaryThis is a clean, minimal consume-PR: version bump in Findings1. Dead
2. Test asserts absence of artifacts but not presence of body-row content (minor) The loop checks 3. Lockfile integrity hash — verification note (informational) The surgical lockfile edit correctly updates all three spots ( No issues found in
|
|
|
||
| it('streams body rows inside the table — no paragraph, no second table (0.5.3)', () => { | ||
| host.streaming.set(true); | ||
| grow('| A | B |\n| - | - |\n'); |
There was a problem hiding this comment.
This initial grow is dead code — the first loop iteration immediately replaces the content with '| A | B |\n| - | - |\n' + '|', so no assertion fires against this intermediate state. You could either drop it or add an assertion here (e.g. expect(el.querySelectorAll('table').length).toBe(1)) if the intent was to verify the committed header+delimiter state before the partial rows begin.
| grow('| A | B |\n| - | - |\n'); | |
| grow('| A | B |\n| - | - |\n'); | |
| expect(el.querySelectorAll('table').length, 'committed header renders as table').toBe(1); |
Bumps
@cacheplane/partial-markdownto 0.5.3 inlibs/chat: while a table is streaming, an in-progress body row now renders as a streaming row inside the table (growing cell-by-cell, padded to header width) instead of momentarily closing the table and flashing as a raw-pipe paragraph (bare|/ one pipe) or a spurious second header-only table (two+ pipes). Completes the streaming-table work begun in 0.5.2 (#739) and the finalize fix (#743). Library side: cacheplane/cacheplane#22, tagpartial-markdown-v0.5.3.streaming-markdown.table-stream.spec.ts— red on 0.5.2 (raw-pipe<p>at'|', 2 tables at'| x1 | y'), green on 0.5.3.Chrome MCP live verification (required gate) — PASSED
Frame-sampled the DOM (MutationObserver, per-mutation) during live gpt-5-mini table streams on
examples-chat(vite dep cache cleared and confirmed serving the 0.5.3 module). Across 6 streamed-table runs:<table>(the 0.5.2 spurious-table artifact is gone)<p>alongside the table (the body-row paragraph flash is gone; pre-fix baseline showed 2 such frames)Orthogonal finding (not this PR; filed separately)
The live gate exposed an intermittent, pre-existing streaming-accumulation bug: streamed deltas occasionally drop characters (captured: delimiter accumulated as
---:---:|while the final message had|---:|---|---:|), so the mid-stream content is invalid GFM and correctly renders as text until the final snapshot replaces it. Replaying the corrupted progression through the parser reproduces the paragraphs; clean content renders a table — proving it's upstream of partial-markdown. Tracked as a follow-up task.🤖 Generated with Claude Code