| 1 | |
| 2 | > reasonix-desktop-frontend@0.0.0 test:transcript <repo>/desktop/frontend |
| 3 | > tsx src/__tests__/chat-view-source.test.ts && tsx src/__tests__/chat-content-loader.test.ts && tsx src/__tests__/chat-details-race.test.tsx && tsx src/__tests__/markdown-natural-flow.test.tsx && tsx src/__tests__/chat-natural-flow.test.tsx && tsx src/__tests__/chat-scroll-controller.test.ts && tsx src/__tests__/markdown-pipeline.test.tsx && tsx src/__tests__/markdown-worker-client.test.ts && tsx src/__tests__/transcript-store.test.ts && tsx src/__tests__/transcript-snapshot-client.test.ts && tsx src/__tests__/transcript-scroll-diagnostics.test.ts && tsx src/__tests__/typography-overflow-contract.test.ts && tsx src/__tests__/nested-scroll-handoff.test.ts |
| 4 | |
| 5 | chat view: stable streaming, settlement, prepend, fold, incomplete history and disposal passed |
| 6 | chat content: concurrency, deduplication, generation and cleanup races passed |
| 7 | tool details: old target completion cannot overwrite the current drawer; session replacement closes details |
| 8 | markdown natural flow: worker races, stable DOM/selection, final references, cache and complete blocks passed |
| 9 | chat natural flow: process disclosure, details, 60-commit cascade and session isolation passed |
| 10 | chat scroll: reader intent, prepend, growth, jump, no-op and stale observer tests passed |
| 11 | |
| 12 | markdown pipeline parity |
| 13 | PASS code-fence fixture exceeds 100KB |
| 14 | PASS headingsAndProse: pipeline render matches react-markdown |
| 15 | PASS headingsAndProse: sliced blocks render identically (3 blocks) |
| 16 | PASS gfmTable: pipeline render matches react-markdown |
| 17 | PASS gfmTable: sliced blocks render identically (1 blocks) |
| 18 | PASS taskList: pipeline render matches react-markdown |
| 19 | PASS taskList: sliced blocks render identically (1 blocks) |
| 20 | PASS strikethroughAutolink: pipeline render matches react-markdown |
| 21 | PASS strikethroughAutolink: sliced blocks render identically (1 blocks) |
| 22 | PASS mathInline: pipeline render matches react-markdown |
| 23 | PASS mathInline: sliced blocks render identically (1 blocks) |
| 24 | PASS mathBlockRepair: pipeline render matches react-markdown |
| 25 | PASS mathBlockRepair: sliced blocks render identically (4 blocks) |
| 26 | PASS mathInlinePipe: pipeline render matches react-markdown |
| 27 | PASS mathInlinePipe: sliced blocks render identically (1 blocks) |
| 28 | PASS footnotes: pipeline render matches react-markdown |
| 29 | PASS footnotes: sliced blocks render identically (2 blocks) |
| 30 | PASS crossBlockRefs: pipeline render matches react-markdown |
| 31 | PASS crossBlockRefs: sliced blocks render identically (5 blocks) |
| 32 | PASS mermaidFence: pipeline render matches react-markdown |
| 33 | PASS mermaidFence: sliced blocks render identically (1 blocks) |
| 34 | PASS bigCodeFence: pipeline render matches react-markdown |
| 35 | PASS bigCodeFence: sliced blocks render identically (1 blocks) |
| 36 | PASS cjk: pipeline render matches react-markdown |
| 37 | PASS cjk: sliced blocks render identically (2 blocks) |
| 38 | PASS rawHtml: pipeline render matches react-markdown |
| 39 | PASS rawHtml: sliced blocks render identically (1 blocks) |
| 40 | PASS unsafeAndFileLinks: pipeline render matches react-markdown |
| 41 | PASS unsafeAndFileLinks: sliced blocks render identically (1 blocks) |
| 42 | PASS manyBlocks: pipeline render matches react-markdown |
| 43 | PASS manyBlocks: sliced blocks render identically (80 blocks) |
| 44 | PASS empty fenced blocks do not render phantom code cards |
| 45 | PASS text around empty fenced blocks remains visible |
| 46 | PASS non-empty comment code blocks remain visible |
| 47 | PASS non-empty comment code keeps its code-block surface |
| 48 | PASS block keys are stable indexes |
| 49 | PASS footnote section is the trailing block |
| 50 | PASS footnote reference links survive slicing |
| 51 | PASS footnote definition anchors survive slicing |
| 52 | PASS urlTransform parity for "https://example.com/a?b=c#d" |
| 53 | PASS urlTransform parity for "http://example.com" |
| 54 | PASS urlTransform parity for "mailto:user@example.com" |
| 55 | PASS urlTransform parity for "javascript:alert(1)" |
| 56 | PASS urlTransform parity for "vbscript:x" |
| 57 | PASS urlTransform parity for "data:text/html,boom" |
| 58 | PASS urlTransform parity for "./relative/path" |
| 59 | PASS urlTransform parity for "../up" |
| 60 | PASS urlTransform parity for "/absolute" |
| 61 | PASS urlTransform parity for "#fragment" |
| 62 | PASS urlTransform parity for "query?only" |
| 63 | PASS urlTransform parity for "ftp://example.com/file" |
| 64 | PASS urlTransform parity for "file:///etc/passwd" |
| 65 | PASS urlTransform parity for "HTTPS://EXAMPLE.COM/upper" |
| 66 | PASS urlTransform parity for "ircs://irc.example.com/chan" |
| 67 | PASS urlTransform parity for "xmpp:user@example.com" |
| 68 | PASS urlTransform parity for "a:b:c" |
| 69 | PASS urlTransform parity for "" |
| 70 | PASS urlTransform parity for "C:\\src\\app.ts" |
| 71 | PASS authority-form UNC survives pipeline URL sanitization |
| 72 | PASS authority-form UNC href survives HAST rendering |
| 73 | PASS unsafe local URL is blanked: file://./PhysicalDrive0 |
| 74 | PASS unsafe local URL is blanked: file:////?/C:/Windows |
| 75 | PASS unsafe local URL is blanked: file:///C:/safe.txt:payload |
| 76 | PASS unsafe local URL is blanked: file:///tmp/report.md?download=1 |
| 77 | PASS unsafe local URL is blanked: file:///tmp/report.md#section |
| 78 | PASS content revision is deterministic |
| 79 | PASS content revision distinguishes texts |
| 80 | PASS hast byte estimate is positive and bounded |
| 81 | PASS hast byte estimate grows with content |
| 82 | |
| 83 | markdown selection projection |
| 84 | PASS selection projection preserves readable structure, code, tables, CJK, emoji and LaTeX |
| 85 | PASS native DOM selection includes Unicode, links and complete code text |
| 86 | PASS selection revision fingerprints projected UTF-16 text |
| 87 | PASS large plain table uses the virtual table representation |
| 88 | PASS virtual table projection includes rows that never mount in the DOM |
| 89 | |
| 90 | 74 passed, 0 failed, 74 total |
| 91 | |
| 92 | markdown worker client |
| 93 | PASS request posted to the worker |
| 94 | PASS response resolves with the full parse result |
| 95 | PASS pending map drains after a response |
| 96 | PASS cancelled parse resolves undefined |
| 97 | PASS cancelling active work terminates the stale parser |
| 98 | PASS late response for a cancelled id is dropped |
| 99 | PASS parse cancelled during worker startup resolves undefined |
| 100 | PASS no pending entry survives an early cancel |
| 101 | PASS worker parse error rejects with its message |
| 102 | PASS pending map drains after an error |
| 103 | PASS crashed worker rejects stranded requests |
| 104 | PASS a fresh parse recreates the worker after a crash |
| 105 | PASS recreated worker serves the retry |
| 106 | PASS fallback resolves the parse result without a Worker |
| 107 | PASS fallback receives the exact source text |
| 108 | PASS dispose settles a pending request (1) |
| 109 | PASS dispose settles a pending request (2) |
| 110 | PASS dispose terminates the worker |
| 111 | PASS dispose drains the pending map |
| 112 | PASS parse after dispose resolves undefined immediately |
| 113 | PASS no pending-request growth across 100 mixed cycles |
| 114 | PASS no unhandled rejections across 100 mixed cycles |
| 115 | PASS every cycle issued exactly one request |
| 116 | PASS worker queue runs only one parse at a time |
| 117 | PASS request ids increase monotonically |
| 118 | |
| 119 | 25 passed, 0 failed, 25 total |
| 120 | |
| 121 | transcript store |
| 122 | PASS paged read pause equals live and legacy history presentation |
| 123 | PASS reloading a pause does not duplicate its card |
| 124 | PASS latest page projects items |
| 125 | PASS latest page reports older history |
| 126 | PASS history user items retain their absolute turn for complete-session navigation |
| 127 | PASS every paged user item carries an absolute history turn |
| 128 | PASS paged concatenation equals single-shot conversion (228 items from 286 messages) |
| 129 | PASS newest page item ids are stable across prepends |
| 130 | PASS item ids are unique across the full projection |
| 131 | PASS 10,000-turn target paging reaches the first page |
| 132 | PASS 10,000-turn target paging respects both turn and production entry bounds |
| 133 | PASS 10,000-turn target paging performs the expected bounded backend calls |
| 134 | PASS targeted pages use the backend's bounded 1000-entry capacity |
| 135 | PASS 10,000-turn target paging preserves every question |
| 136 | PASS 10,000-turn target paging lands on absolute turn one |
| 137 | PASS 10,000-turn target paging keeps the tail coordinate |
| 138 | PASS 10,000-turn target paging keeps item ids unique |
| 139 | PASS 10,000-turn transcript stays within the production history body budget |
| 140 | PASS 10,000-turn targeted paging completes within 10s (1190.8ms) |
| 141 | PASS result row converts standalone before its call pages in |
| 142 | PASS standalone result keeps the toolCallId item id |
| 143 | PASS older page prepends |
| 144 | PASS the standalone result item is superseded by the merged call item |
| 145 | PASS exactly one tool item after the merge (no duplicate) |
| 146 | PASS merged tool item takes the call's args |
| 147 | PASS merged tool item takes the result's output |
| 148 | PASS merged tool item is done |
| 149 | PASS merged projection equals single-shot conversion |
| 150 | PASS append contributes the new rows' items |
| 151 | PASS append keeps existing item ids |
| 152 | PASS append grows the projection |
| 153 | PASS three sessions resident at the cap |
| 154 | PASS fourth session evicts the least-recently-used one |
| 155 | PASS new session stays resident |
| 156 | PASS pinned sessions do not count toward the resident cap |
| 157 | PASS pinned live session survives eviction |
| 158 | PASS oldest unpinned session evicts instead |
| 159 | PASS evicted session re-opens via a fresh slice fetch |
| 160 | PASS re-opened session restores its full projection |
| 161 | PASS history body budget holds across sessions |
| 162 | PASS byte budget evicts the oldest by weight |
| 163 | PASS newest session survives byte-budget eviction |
| 164 | PASS markdown cache returns stored value |
| 165 | PASS markdown LRU evicts the least-recently-used entry |
| 166 | PASS recently read markdown entry survives |
| 167 | PASS markdown entries key on entryId + revision |
| 168 | PASS active selection pins its markdown projection |
| 169 | PASS newest-page references stay lazy until the view requests them |
| 170 | PASS the view can distinguish a missing full value from an unreferenced body |
| 171 | PASS fixture fits in one page |
| 172 | PASS resolved full content replaces the inline preview |
| 173 | PASS content resolution notifies subscribers with item patches |
| 174 | PASS resolved content is served from the record |
| 175 | PASS resolved content is not re-fetched |
| 176 | PASS stale ref keeps the inline preview |
| 177 | PASS latest page still projects |
| 178 | PASS superseded load discards its late response |
| 179 | PASS the latest load wins |
| 180 | PASS evicted session discards its late response |
| 181 | PASS evicted records never land |
| 182 | PASS the requested first-generation content is in flight |
| 183 | PASS late content chunk from a previous generation is discarded |
| 184 | PASS stale cursor triggers a latest-page reload |
| 185 | PASS reload replaces with the fresh newest page |
| 186 | PASS paging resumes after the reload |
| 187 | PASS older page prepends after reload |
| 188 | PASS matching canonical fingerprint reuses the resident projection |
| 189 | PASS resident projection retains its canonical revision |
| 190 | PASS changed same-path fingerprint bypasses the resident projection |
| 191 | PASS fresh projection adopts the advanced canonical digest |
| 192 | PASS positive legacy slice revision implies a known canonical identity |
| 193 | PASS legacy tool parameters load completely |
| 194 | PASS legacy tool output loads completely |
| 195 | PASS legacy tool parameters load completely |
| 196 | PASS legacy tool output loads completely |
| 197 | PASS reopening reads only the selected tool's two references |
| 198 | PASS full details leave the preview Item unchanged |
| 199 | |
| 200 | 77 passed, 0 failed |
| 201 | transcript snapshot client races, independent concurrent fields and complete tool details: ok |
| 202 | transcript scroll diagnostics tests passed |
| 203 | |
| 204 | typography overflow contract |
| 205 | PASS chat content can shrink beside the dock launcher |
| 206 | PASS completed markdown wraps the same long tokens as the stream tail |
| 207 | PASS reasoning wraps long tokens |
| 208 | PASS inline reasoning wraps long tokens |
| 209 | PASS .md pre retains its own wrapping contract |
| 210 | PASS .md pre code retains its own wrapping contract |
| 211 | PASS .md table retains its own wrapping contract |
| 212 | PASS .md .katex retains its own wrapping contract |
| 213 | PASS only complete commands opt into code wrapping |
| 214 | PASS commands wrap continuous tokens |
| 215 | PASS command loading and loaded views share the height cap |
| 216 | PASS text-size presets include the large accessibility step |
| 217 | PASS legacy sans alias stays synced with UI font |
| 218 | PASS xxlarge has a real scale bump |
| 219 | PASS status bar dock height scales with interface text size |
| 220 | PASS layout reserves scaled status bar height |
| 221 | PASS app height follows the live viewport height variable |
| 222 | PASS empty transcript can scroll instead of clipping |
| 223 | PASS welcome empty state is not clipped by its own box |
| 224 | PASS non-transcript markdown still culls offscreen blocks with a 72px placeholder |
| 225 | PASS natural chat uses real Markdown geometry |
| 226 | PASS chat has one readable column |
| 227 | PASS chat uses native vertical scrolling |
| 228 | PASS normal chat inset is 24px |
| 229 | PASS narrow chat inset is 16px |
| 230 | PASS narrow details cover the chat surface |
| 231 | PASS empty-state auto margins apply only to the welcome content |
| 232 | PASS empty-state generic children do not receive auto margins |
| 233 | PASS fixed status bar height follows the scaled dock token |
| 234 | PASS status bar min-height follows the scaled dock token |
| 235 | PASS brand list scrolls independently |
| 236 | PASS provider detail can shrink within its column |
| 237 | PASS long model IDs wrap within the detail |
| 238 | PASS provider model rows grow with their content |
| 239 | PASS provider model cards do not force undersized rows |
| 240 | PASS provider model cards contain overflowing controls |
| 241 | PASS compaction choices fit the settings control width |
| 242 | PASS compaction rows align radio, label, percentage and explanation |
| 243 | PASS compaction rows retain a stable click target |
| 244 | PASS compaction explanations can shrink and wrap |
| 245 | PASS percentage suffix remains visible beside the editable value |
| 246 | PASS status bar keeps metrics on one row |
| 247 | PASS status bar hides vertical overflow |
| 248 | PASS .statusbar__model clips long text |
| 249 | PASS .statusbar__model uses ellipsis |
| 250 | PASS .statusbar__model stays on one line |
| 251 | PASS .sidebar-im__summary-label clips long text |
| 252 | PASS .sidebar-im__summary-label uses ellipsis |
| 253 | PASS .sidebar-im__summary-label stays on one line |
| 254 | PASS .sidebar-im__summary-status clips long text |
| 255 | PASS .sidebar-im__summary-status uses ellipsis |
| 256 | PASS .sidebar-im__summary-status stays on one line |
| 257 | PASS .workbench-dock__tab-label clips long text |
| 258 | PASS .workbench-dock__tab-label uses ellipsis |
| 259 | PASS .workbench-dock__tab-label stays on one line |
| 260 | PASS .workspace-files__scope-title clips long text |
| 261 | PASS .workspace-files__scope-title uses ellipsis |
| 262 | PASS .workspace-files__scope-title stays on one line |
| 263 | PASS .workspace-files__scope-meta clips long text |
| 264 | PASS .workspace-files__scope-meta uses ellipsis |
| 265 | PASS .workspace-files__scope-meta stays on one line |
| 266 | PASS .context-panel__section-head span clips long text |
| 267 | PASS .context-panel__section-head span uses ellipsis |
| 268 | PASS .context-panel__section-head span stays on one line |
| 269 | PASS .context-panel__metric span clips long text |
| 270 | PASS .context-panel__metric span uses ellipsis |
| 271 | PASS .context-panel__metric span stays on one line |
| 272 | PASS .context-panel__metric strong clips long text |
| 273 | PASS .context-panel__metric strong uses ellipsis |
| 274 | PASS .context-panel__metric strong stays on one line |
| 275 | PASS .app--creation .context-panel__mini-stat-label clips long text |
| 276 | PASS .app--creation .context-panel__mini-stat-label uses ellipsis |
| 277 | PASS .app--creation .context-panel__mini-stat-label stays on one line |
| 278 | PASS .app--creation .context-panel__mini-stat strong clips long text |
| 279 | PASS .app--creation .context-panel__mini-stat strong uses ellipsis |
| 280 | PASS .app--creation .context-panel__mini-stat strong stays on one line |
| 281 | PASS .topbar__model clips long text |
| 282 | PASS .topbar__model uses ellipsis |
| 283 | PASS .topbar__model stays on one line |
| 284 | PASS .composer-modebar__item span clips long text |
| 285 | PASS .composer-modebar__item span uses ellipsis |
| 286 | PASS .composer-modebar__item span stays on one line |
| 287 | PASS .composer-more-menu__item span clips long text |
| 288 | PASS .composer-more-menu__item span uses ellipsis |
| 289 | PASS .composer-more-menu__item span stays on one line |
| 290 | PASS creation dock skips zero-width grid interpolation on open |
| 291 | PASS creation overview usage card disables inherited entrance animation |
| 292 | PASS creation overview rows avoid edge-pinned value alignment |
| 293 | PASS creation overview rows avoid the spacer grid that pushes values to the edge |
| 294 | PASS creation overview values are not capped to a fixed 14ch width |
| 295 | PASS session metric labels and rate badges share a compact header row |
| 296 | PASS rate badges remain visible without truncating the amount row |
| 297 | PASS rate badge labels stay intact |
| 298 | PASS chat mode switcher contains enlarged labels |
| 299 | PASS task method selector keeps its current state visible at narrow widths |
| 300 | PASS task method selector truncates its value only when constrained |
| 301 | PASS model selector uses the shared control weight |
| 302 | PASS execution policy and model settings have a compact visual divider |
| 303 | PASS composer enters icon-only mode before model and effort controls overlap |
| 304 | PASS approval mode switcher shrinks with its compact composer container |
| 305 | PASS ask approval restores the solid semantic fill |
| 306 | PASS auto approval keeps high-contrast text on its solid fill |
| 307 | PASS yolo approval restores the solid warning fill |
| 308 | PASS task method menu uses the shared menu width |
| 309 | PASS menu descriptions can wrap onto a second line |
| 310 | PASS menu descriptions no longer use single-line ellipsis |
| 311 | PASS task method selector uses the shared keyboard focus ring |
| 312 | PASS model and effort selectors use the shared keyboard focus ring |
| 313 | PASS active permission options retain keyboard focus feedback |
| 314 | PASS creation assistant body text follows the conversation text size |
| 315 | PASS themed assistant body text follows the conversation text size |
| 316 | PASS creation assistant body follows the conversation font family |
| 317 | PASS creation markdown follows the conversation font family |
| 318 | PASS creation composer input follows the composer text size |
| 319 | PASS interface text resolves its own exact regional size |
| 320 | PASS conversation text resolves its own exact regional size |
| 321 | PASS composer text resolves its own exact regional size |
| 322 | PASS code text resolves its own exact regional size |
| 323 | PASS code blocks keep the regional code font |
| 324 | PASS inline code keeps the regional code font |
| 325 | PASS nested code text inherits the regional code font |
| 326 | PASS line-numbered code text inherits its viewer font |
| 327 | PASS line-numbered code viewers use the regional code font |
| 328 | PASS diff text follows the global scale until the code region is customized |
| 329 | PASS message metadata keeps its regional size |
| 330 | PASS composer metadata keeps the regional font |
| 331 | PASS status bar keeps the regional font |
| 332 | PASS conversation preview uses the exact conversation size |
| 333 | PASS interface preview uses the exact interface size |
| 334 | PASS composer preview uses the exact composer size |
| 335 | PASS code preview uses the exact code size |
| 336 | PASS metadata preview uses the exact supporting-text size |
| 337 | PASS live preview renders the selected region's exact size |
| 338 | PASS creation reasoning keeps the conversation font |
| 339 | PASS creation tool names keep the code font |
| 340 | PASS creation rules do not hardcode bare px font sizes (except font-size:0) |
| 341 | PASS creation context-ring popover (portaled to body) follows interface text size |
| 342 | PASS context-ring popover rules do not hardcode bare px font sizes (except font-size:0) |
| 343 | PASS collapsed creation tool bodies keep mounted content clipped |
| 344 | PASS collapsed creation tool bodies do not paint hidden tool text |
| 345 | PASS composer compact controls activate at the capped theme width |
| 346 | PASS markdown table wrapper scrolls horizontally |
| 347 | PASS markdown table wrapper does not nest vertical scroll |
| 348 | PASS markdown tables stay in document flow for trackpad Y |
| 349 | PASS code blocks scroll horizontally instead of widening the layout |
| 350 | PASS code blocks do not nest vertical scroll by default |
| 351 | PASS settings center stacks navigation before the modal is too narrow |
| 352 | PASS settings fields collapse to one column at the mid-width breakpoint |
| 353 | PASS settings modal only becomes fullscreen at the narrow breakpoint |
| 354 | PASS narrow workbench layout hides side panels and keeps chat single-column |
| 355 | PASS .reasoning__head font size follows the text-size scale |
| 356 | PASS .turn-collapse__reasoning-head font size follows the text-size scale |
| 357 | PASS .process-card__head font size follows the text-size scale |
| 358 | PASS .tool__difflabel font size follows the text-size scale |
| 359 | PASS .msg-memory-citations font size follows the text-size scale |
| 360 | PASS .msg-memory-citations__source font size follows the text-size scale |
| 361 | PASS .msg-memory-citations__note font size follows the text-size scale |
| 362 | PASS .msg-attachment__name font size follows the text-size scale |
| 363 | PASS .msg-attachment__meta font size follows the text-size scale |
| 364 | PASS .msg-pasted-head font size follows the text-size scale |
| 365 | PASS .msg-pasted-expanded font size follows the text-size scale |
| 366 | PASS .msg__send-failed font size follows the text-size scale |
| 367 | PASS :root[data-theme-style] .process-card__kind font size follows the text-size scale |
| 368 | PASS :root[data-theme-style] .msg--assistant > .process-card[data-tone="violet"] .process-card__name font size follows the text-size scale |
| 369 | |
| 370 | 164 passed, 0 failed, 164 total |
| 371 | |
| 372 | nested scroll handoff |
| 373 | PASS nested can scroll up from mid-body |
| 374 | PASS nested can scroll down from mid-body |
| 375 | PASS nested cannot scroll up at top |
| 376 | PASS nested cannot scroll down at bottom |
| 377 | PASS horizontal-only wrapper cannot scroll vertically |
| 378 | PASS wheel-up at nested top should handoff to parent |
| 379 | PASS wheel-up mid nested should not handoff |
| 380 | PASS wheel over horizontal-only table wrapper handoffs vertical to parent |
| 381 | PASS edge wheel is preventDefaulted |
| 382 | PASS edge wheel promotes deltaY onto parent scrollTop |
| 383 | PASS edge handoff notifies parent scroll intent |
| 384 | PASS edge handoff reports normalized direction to the parent controller |
| 385 | PASS latched gesture continues on parent |
| 386 | PASS latched wheel keeps applying to parent |
| 387 | PASS latched handoff keeps reporting normalized direction |
| 388 | PASS mid nested wheel is left to the browser after latch expires |
| 389 | PASS mid nested wheel does not move parent after latch expires |
| 390 | PASS line-mode wheel deltas use a stable pixel fallback |
| 391 | PASS page-mode wheel deltas use the transcript viewport height |
| 392 | PASS line-mode handoff applies normalized pixels instead of raw lines |
| 393 | PASS page-mode handoff applies one viewport page |
| 394 | |
| 395 | 21 passed, 0 failed |
| 396 |