返回 DeepSeek-Reasonix
unit-discovery.log
根目录 / docs / evidence / chat-refactor / unit-discovery.log
1 run-tests: 337 discovered suites (39 owned by dedicated scripts)
2
3 ▶ src/__tests__/activate-topic-stale.test.tsx
4
5 activate topic stale completion
6 PASS held activation does not flip the tab early
7 PASS stale activation must not flip the visible tab
8 PASS stale activation must not delete the visible tab's cached state
9 PASS queued click invalidates the running activation (no flip to tab-y)
10 PASS queued click keeps the visible tab's cached state intact
11 PASS A starts the rapid switch with a visible ask
12 PASS A→X renders the slow target optimistically
13 PASS A→X→A returns to the prompt owner
14 PASS returning to A preserves its ask
15 PASS post-activation replay is scoped to A
16 PASS late X activation cannot replace A
17 PASS late X activation reasserts A as backend owner
18 PASS late X completion cannot clear A's ask
19
20 13 passed, 0 failed
21
22 ▶ src/__tests__/active-tab-mirror.test.tsx
23 active tab mirror: commit-following writes, async reads and unmount release passed
24
25 ▶ src/__tests__/activity-bar-store.test.ts
26 PASS store persists under reasonix.dock.tabs
27 PASS openEntry opens the first tab
28 PASS openEntry activates the tab
29 PASS openEntry appends a different type
30 PASS openEntry reuses same-type tab
31 PASS openEntry switches back to the reused tab
32 PASS opening a tab expands the container
33 PASS closeTab removes the tab
34 PASS closing a non-active tab keeps the active tab
35 PASS closeTab activates left neighbor
36 PASS closing the last tab clears activeTabId
37 PASS closing the last tab collapses the container
38 PASS persistence writes tabs
39 PASS persistence writes activeTabId
40 PASS collapse via setActivityBarOpen keeps tabs
41 PASS collapse via setActivityBarOpen closes the container
42 PASS re-expand restores the container
43 PASS addMenuOpen setter works
44 PASS fresh tab ids are unique
45 PASS moveTab left places the tab before the target
46 PASS moveTab persists
47 PASS moveTab right places the tab after the target
48 PASS moveTab keeps the active tab
49 PASS moveTab same id is a no-op
50 PASS closeTab records the closed tab
51 PASS closeTab stamps the close time
52 PASS the closed tab is gone from the list
53 PASS reopenTab restores the tab
54 PASS reopenTab activates it
55 PASS reopenTab drops it from the closed list
56 PASS reopenTab persists the restored tab
57 PASS recently closed is bounded to 10 newest first
58 PASS new project has no closed tabs
59 PASS cannot reopen another project's tab
60 PASS returning restores A closed history
61 PASS reopen preserves B identity
62
63 activity-bar-store: 36 passed, 0 failed
64
65 ▶ src/__tests__/anchored-popover-scroll.test.tsx
66
67 anchored popover scroll positioning
68 PASS unmeasured popover uses the visible horizontal fallback
69 PASS unmeasured popover uses the visible vertical fallback
70 PASS unmeasured popover remains visible
71 PASS fallback position does not pretend layout is ready
72 PASS popover starts below the anchor
73 PASS popover becomes ready after measurement recovers
74 PASS popover follows the anchor after a scroll event
75 PASS popover keeps its last valid position while the anchor is unavailable
76 PASS temporary anchor loss keeps the last measured position ready
77
78 9 passed, 0 failed
79
80 ▶ src/__tests__/app-chrome-tabs.test.ts
81
82 app chrome tabs
83 PASS identical tab metadata suppresses redundant state writes
84 PASS runtime tab changes still invalidate metadata state
85 PASS visible tab metadata fallback runs at low frequency
86 PASS hidden tab metadata fallback backs off further
87 PASS turn start refreshes tab runtime metadata immediately
88 PASS approval prompts refresh tab runtime metadata immediately
89 PASS stream deltas do not trigger tab-list requests
90 PASS tab metadata refresh caps outstanding backend calls
91 PASS saturated tab metadata refresh joins the newest request
92 PASS saturated tab metadata refresh returns authoritative tabs instead of an empty sentinel
93 PASS coalesced newest tab metadata remains eligible to update state
94 PASS an older tab metadata response cannot replace a newer snapshot
95 PASS pre-mutation tab metadata fills both in-flight slots
96 PASS post-mutation refresh does not start until an in-flight slot frees
97 PASS post-mutation refresh starts as a trailing load after a slot frees
98 PASS pre-mutation snapshot is not authoritative after invalidate
99 PASS post-mutation refresh does not join a pre-mutation request
100 PASS post-mutation refresh returns the mutation-after snapshot
101 PASS post-mutation trailing refresh remains eligible to update state
102 PASS pre-mutation coalesced request cannot overwrite post-mutation state
103 PASS queued invalidations retain only the latest trailing load
104 PASS queued invalidations fence the pre-mutation load
105 PASS an older queued mutation waits for the latest post-mutation snapshot
106 PASS the latest queued mutation receives its post-mutation snapshot
107 PASS the shared trailing snapshot remains authoritative
108 PASS tab metadata refresh is event-driven with a visibility-aware fallback
109 PASS right dock open state is restored from per-project localStorage with expanded first-launch default
110 PASS workbench chrome is hidden for every desktop platform
111 PASS workbench keeps chrome controls in the topic bar
112 PASS retired transcript reveal state is removed
113 PASS jump-to-bottom affordance uses localized transcript text
114 PASS command palette highlights the first item when opened with an empty query
115 PASS topic shortcuts use the resolved desktop platform
116 PASS topic shortcut badges render the platform-specific modifier
117 PASS topic shortcut badge state is cleared when disabled, interrupted, or cleaned up
118 PASS session-changing controller actions use explicit tab-scoped bridge bindings
119 PASS rewind previews warn on incomplete coverage and only authorize file overwrite after a conflict confirmation
120 PASS Welcome stays suppressed through target data commit and navigation settles only after paint readiness
121 PASS Creation hero composer auto-grows multi-line drafts instead of clipping at 20px
122 PASS topic, blank, IM, and history navigation all use the shared coalescing path
123 PASS history navigation does not re-resume a session that topic activation already pinned
124 PASS Windows sidebar avoids native window drag without changing other platforms
125 PASS the shell bar is the window drag surface and opts its controls out
126 PASS transcript content does not participate in native app-region subtraction
127 PASS the chat pane clips overflow so zoomed transcript boxes cannot paint into the shell bar
128 PASS Windows Creation stays 40px while macOS and Linux keep the shared Creation geometry
129 PASS the shell bar spans every column as the layout's first row
130 PASS macOS leaves safe space for inset window controls on the shell bar, not the sidebar
131 PASS the dock's control strip is not a window drag region, so every control stays clickable
132 PASS the dock panel stretches its tab container so in-dock popovers are not clipped
133 PASS active dock tab underline is removed in favor of the rounded-rect selected state
134 PASS .app--workbench .workbench-dock__tab + .workbench-dock__tab::before renders a restrained divider between right-dock tabs
135 PASS Creation right-dock tabs keep their equal-column treatment without dividers
136 PASS the Windows caption inset sits on the shell bar, not on the dock's tools row
137 PASS workbench keeps compact four-tab spacing at narrow dock widths
138 PASS :root[data-theme-style] .app--workbench .topicbar stays flat after removing the workbench chrome row
139 PASS :root[data-theme-style] .app--workbench .topicbar__chrome-btn stays flat after removing the workbench chrome row
140 PASS :root[data-theme-style] .app--workbench .topicbar__icon-btn stays flat after removing the workbench chrome row
141 PASS :root[data-theme-style] .app--workbench .topicbar__action-btn stays flat after removing the workbench chrome row
142 PASS workbench topic bar uses elevated background for light-mode white
143 PASS :root[data-theme-style] .app--workbench .topicbar__identity cannot paint residual title-row shadows in workbench mode
144 PASS :root[data-theme-style] .app--workbench .topicbar__title-row cannot paint residual title-row shadows in workbench mode
145 PASS :root[data-theme-style] .app--workbench .topicbar__title-row h1 cannot paint residual title-row shadows in workbench mode
146 PASS :root[data-theme-style] .app--workbench .tooltip-trigger:has(.topicbar__icon-btn) cannot paint residual title-row shadows in workbench mode
147 PASS :root[data-theme-style] .app--workbench .topicbar__icon-btn does not paint a hover block in workbench mode
148 PASS :root[data-theme-style] .app--workbench .topicbar__chrome-btn does not paint a hover block in workbench mode
149 PASS :root[data-theme-style] .app--workbench .topicbar__icon-btn:hover does not paint a hover block in workbench mode
150 PASS :root[data-theme-style] .app--workbench .topicbar__icon-btn:focus-visible does not paint a hover block in workbench mode
151 PASS :root[data-theme-style] .app--workbench .topicbar__chrome-btn:hover:not(.topicbar__chrome-btn--blocked) does not paint a hover block in workbench mode
152 PASS :root[data-theme-style] .app--workbench .topicbar__chrome-btn:focus-visible:not(.topicbar__chrome-btn--blocked) does not paint a hover block in workbench mode
153 PASS offscreen skip link does not leak its focus shadow into the workbench title area
154 PASS title-bar double click zooms on macOS as well as frameless Windows
155 PASS title-bar double click still ignores interactive controls
156
157 73 passed, 0 failed
158
159 ▶ src/__tests__/app-lifecycle-probe.test.ts
160 PASS lifecycle probe exposes retained cohorts and duplicate cleanup
161
162 ▶ src/__tests__/app-lifecycle.test.tsx
163 PASS App committed commands and source-bound operation ownership are lifecycle safe
164
165 ▶ src/__tests__/approval-animation.test.tsx
166
167 approval shelf animation
168 PASS shelf exit passes a valid CSS easing to Element.animate
169 PASS approval waits for the shelf exit animation
170 PASS approval starts one shelf exit animation
171 PASS finish and late cancel submit the approval only once
172 PASS finished animation preserves the selected approval
173 PASS cancelled shelf animation still submits the approval once
174 PASS a rejected animation is not retried by a second confirm
175 PASS a rejected animation falls back to one approval submission
176 PASS animation fallback preserves the selected approval
177
178 9 passed, 0 failed, 9 total
179
180 ▶ src/__tests__/approval-modal-file-reference.test.tsx
181
182 approval modal file references
183 PASS plan revision file trigger ignores an invisible trailing newline
184 PASS plan revision file selection removes an invisible trailing newline
185 PASS plan revision @ text opens file suggestions
186 PASS plan revision file suggestions stay scoped to the active tab
187 PASS file suggestion completes inline in the plan revision
188 PASS submitted plan revision keeps the selected file reference
189 PASS sandbox escape approval keeps the command visible in Chinese UI
190 PASS sandbox escape approval removes the redundant scope prefix from the command block
191 PASS sandbox escape approval renders the command once
192 PASS sandbox escape approval localizes the retired Windows backend reason in Chinese UI
193 PASS sandbox escape Chinese approval shows allow once
194 PASS sandbox escape Chinese approval shows session grant
195 PASS sandbox escape Chinese approval shows deny
196 PASS sandbox escape Chinese approval hides persistent grant
197 PASS sandbox escape approval localizes the runtime failure reason in Chinese UI
198 PASS remember approval localizes tool label in Chinese UI
199 PASS remember approval localizes subject prefix in Chinese UI
200 PASS remember approval localizes body label in Chinese UI
201 PASS plan-mode read-only command approval localizes tool label in Chinese UI
202 PASS plan-mode read-only command approval localizes subject in Chinese UI
203 PASS plan-mode read-only command approval localizes reason in Chinese UI
204 PASS approval identifies the exact matched permission rule
205 PASS dynamic Bash approval explains the matched safety boundary in Chinese
206 PASS dynamic Bash approval tells the user how to grant the command
207 PASS opening plan revision focuses its textarea once
208 PASS parent rerender does not return focus to plan revision
209 PASS parent rerender preserves transcript text selection
210 PASS workspace add-reference insert request targets the plan revision input
211 PASS plan revision reports itself as the active workspace insertion target
212 PASS tool approval shows its full subject by default
213 PASS default-open tool approval keeps the complete subject visible
214 PASS tool approval renders the command once instead of repeating it in header metadata
215 PASS tool approval omits duplicate subject metadata
216 PASS ordinary tool approval exposes four select-then-confirm options
217 PASS default selection is allow once
218 PASS persistent option carries a native title fallback
219 PASS decision surface shows an explicit confirm button
220 PASS clicking an option only changes selection
221 PASS selection state updates without submitting
222 PASS fresh-human approval shows allow once
223 PASS fresh-human approval shows deny
224 PASS fresh-human approval hides session grant
225 PASS fresh-human approval hides persistent grant
226 PASS fresh-human approval keeps conventional allow/deny shortcut keys with inline consequences
227 PASS clicking allow once only selects; does not approve yet
228 PASS fresh-human approval allows only once after confirm
229 PASS fresh-human numeric 2 only selects deny
230 PASS fresh-human Enter after digit 2 denies
231 PASS sandbox escape approval uses a clear tool label
232 PASS sandbox escape approval shows allow once
233 PASS sandbox escape approval shows session grant
234 PASS sandbox escape approval shows deny
235 PASS sandbox escape approval hides persistent grant
236 PASS sandbox escape keeps three options
237 PASS sandbox escape Enter on selected session action grants session
238 PASS sandbox escape numeric 3 only selects deny
239 PASS sandbox escape Enter after digit 3 denies
240 PASS current approval session file refs stay visible
241 PASS late approval session file refs are ignored
242
243 59 passed, 0 failed, 59 total
244
245 ▶ src/__tests__/ask-card-identity.test.tsx
246 PASS keyboard focus and Enter submit the custom answer exactly once
247 PASS drafts follow tab, runtime, turn, and prompt identity across replay and replacement
248
249 ▶ src/__tests__/ask-card-layout.test.ts
250
251 ask card layout
252 PASS ask question text remains complete in the prompt shelf
253 PASS ask question can wrap instead of staying on one line
254 PASS ask question is not clipped by the prompt shelf
255 PASS ask question does not render as an ellipsis-only preview
256 PASS long unspaced ask questions can break within the shelf
257 PASS ask prompt shelf keeps dialog semantics
258 PASS ask uses the unified decision surface layout
259 PASS Ask card stays bounded by the viewport
260 PASS Ask card delegates overflow to one content scroller
261 PASS Ask title, question, and options share one scroll region
262 PASS Ask confirmation footer stays outside the scrolling content
263 PASS Ask skip is a quiet footer action
264 PASS ask renders only selectable options; custom answer is an always-visible input row
265 PASS option descriptions render inline on each decision row
266 PASS decision row wrappers accommodate optional external details
267 PASS decision rows stay content-sized at the top of the scroll region
268 PASS Ask options do not create a nested scroll region
269 PASS Ask option overflow belongs to the shared content scroller
270 PASS desktop decision rows keep a stable compact height
271 PASS short decision rows retain a compact click target
272 PASS single-line decision copy stays vertically centered with the option key
273 PASS decision keys do not carry a top offset
274 PASS decision option labels size to content while staying capped at 44% of the row
275 PASS decision option labels never resolve their width cap against their own content-sized track
276 PASS long option descriptions stay on one stable summary line
277 PASS Ask summaries use ordinary single-line flow
278 PASS collapsed Ask summaries stay inside their row
279 PASS selection never changes the summary to two lines
280 PASS long summaries end with a clear ellipsis
281 PASS unspaced summaries stay clipped inside the stable row
282 PASS normal short labels preserve the existing description tooltip
283 PASS truncated descriptions expose an explicit full-text action
284 PASS full description starts collapsed
285 PASS disclosure identifies the separate detail region
286 PASS full detail region starts hidden
287 PASS Enter on Ask disclosure never confirms the selected answer
288 PASS Ask disclosure owns keyboard activation before global shortcuts
289 PASS Enter expands the Ask description
290 PASS Enter collapses the Ask description again
291 PASS opening details does not resize the selected row
292 PASS expanded state is announced
293 PASS opening details keeps the selected row vertically centered
294 PASS the row summary remains clipped after opening details
295 PASS full description opens in a separate region
296 PASS opened detail scrolls above the fixed decision footer
297 PASS separate detail region reveals the complete text
298 PASS separate detail region can be collapsed again
299 PASS collapsed state is announced
300 PASS short selected descriptions do not show a redundant disclosure
301 PASS single-select click advances without submitting the final answer
302 PASS confirm submits the selected single-select answer
303 PASS submitted answer matches the selected option
304 PASS label-only decisions use the full copy width before truncating
305 PASS overflowing legacy labels keep the stable compact row
306 PASS overflowing labels retain their complete native tooltip
307 PASS overflowing label detail starts collapsed
308 PASS overflowing label can be expanded outside the stable row
309 PASS opened label detail is brought into the visible decision scroller
310 PASS label-only detail reveals the original complete decision text once
311 PASS full label detail wraps instead of being ellipsized again
312 PASS opening a long label never submits the decision
313 PASS long label decision still submits normally
314 PASS display fallback does not alter the answer value
315 PASS multi-select confirm stays disabled until an option is chosen
316 PASS multi-select confirm enables after selecting one option
317 PASS multi-select click does not submit
318 PASS multi-select confirm submits once
319 PASS multi-select keeps chosen labels
320 PASS initial keyboard cursor marks the first option
321 PASS initial option cursor enables confirm without a click
322 PASS ArrowDown moves the single-select cursor off the first row
323 PASS ArrowDown selects the second option visually
324 PASS keyboard selection stays inside the visible option viewport
325 PASS ArrowDown keeps confirm enabled for the highlighted option
326 PASS ArrowDown+Enter submits the highlighted single-select option
327 PASS submitted answer matches the keyboard cursor
328 PASS initial Enter submits without a prior click
329 PASS initial Enter uses the first highlighted option
330 PASS custom input accepts a draft
331 PASS selecting an option clears the visible custom draft without removing the input row
332 TypeError: activeElement$1.attachEvent is not a function
333 at handleEventsForInputEventPolyfill (<repo>/desktop/node_modules/.pnpm/react-dom@19.2.8_react@19.2.8/node_modules/react-dom/cjs/react-dom-client.development.js:3573:27)
334 at <repo>/desktop/node_modules/.pnpm/react-dom@19.2.8_react@19.2.8/node_modules/react-dom/cjs/react-dom-client.development.js:19638:15
335 at batchedUpdates$1 (<repo>/desktop/node_modules/.pnpm/react-dom@19.2.8_react@19.2.8/node_modules/react-dom/cjs/react-dom-client.development.js:3252:40)
336 at dispatchEventForPluginEventSystem (<repo>/desktop/node_modules/.pnpm/react-dom@19.2.8_react@19.2.8/node_modules/react-dom/cjs/react-dom-client.development.js:19320:7)
337 at dispatchEvent (<repo>/desktop/node_modules/.pnpm/react-dom@19.2.8_react@19.2.8/node_modules/react-dom/cjs/react-dom-client.development.js:23585:11)
338 at dispatchDiscreteEvent (<repo>/desktop/node_modules/.pnpm/react-dom@19.2.8_react@19.2.8/node_modules/react-dom/cjs/react-dom-client.development.js:23553:11)
339 at HTMLDivElement.callTheUserObjectsOperation (<repo>/desktop/node_modules/.pnpm/jsdom@30.0.1/node_modules/jsdom/lib/generated/idl/EventListener.js:26:30)
340 at innerInvokeEventListeners (<repo>/desktop/node_modules/.pnpm/jsdom@30.0.1/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:360:16)
341 at invokeEventListeners (<repo>/desktop/node_modules/.pnpm/jsdom@30.0.1/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:296:3)
342 at HTMLInputElementImpl._dispatch (<repo>/desktop/node_modules/.pnpm/jsdom@30.0.1/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:243:9)
343 PASS reopening custom restores the draft
344 PASS custom mode submits the restored draft
345 PASS multi-select cursor alone is not aria-selected
346 PASS multi-select marks the keyboard cursor with data-active
347 PASS multi-select confirm stays disabled until an option is checked
348 PASS ArrowDown clears the previous multi-select cursor
349 PASS ArrowDown moves the multi-select cursor
350 PASS ArrowDown does not check the multi-select option
351 PASS ArrowDown alone does not enable multi-select confirm
352 PASS click checks the multi-select option
353 PASS multi-select confirm enables after a real check
354 PASS multi-question Ask advances to question 2
355 PASS Back returns to the previous question
356 PASS previous question accepts a replacement choice
357 PASS failed final submit is attempted exactly once
358 PASS failed final submit stays on question 2
359 PASS failed final submit preserves the revised first answer
360 PASS failed final submit preserves the second answer
361 PASS failed final submit re-enables retry
362 PASS retry submits once after the failure
363 PASS retry submits the preserved answer batch
364 PASS skipping the final question submits once
365 PASS skipping submits an empty answer
366 PASS Ask exposes the shared collapsible shelf contract
367 PASS Ask starts expanded
368 PASS collapse action hides the Ask body
369 PASS collapsed Ask keeps its header visible
370 PASS collapsed Ask hides its option list
371 PASS collapsed Ask hides its footer
372 PASS expand action restores the Ask body
373 PASS clicking an option does not collapse the Ask
374 PASS Ask drafts do not cross tab scopes
375 PASS a remounted Ask starts expanded like harness
376 PASS Ask answer draft restores within the tab scope
377
378 114 passed, 0 failed, 114 total
379
380 ▶ src/__tests__/ask-submit.test.ts
381
382 Ask prompt active-turn submission
383 PASS Ask refreshes the authoritative turn before submission
384 PASS authoritative turn fences the exact answer
385 PASS missing local turn id is resolved from ListTabs once
386 PASS resolved turn id fences the exact answer
387 PASS missing authoritative turn id rejects visibly
388 PASS missing turn id never calls the exact endpoint with an empty fence
389 PASS authoritative turn lookup failure propagates
390 PASS failed turn lookup never calls the exact endpoint
391 PASS exact endpoint rejection propagates to the decision surface
392 PASS missing exact prompt API fails closed
393
394 10 passed, 0 failed, 10 total
395
396 ▶ src/__tests__/at-matches.test.ts
397
398 at-matches filter
399 PASS src/planind/index.tsx + planind → surfaces the nested file
400 PASS src/planind/index.tsx + index → still surfaces via basename
401 PASS entries ∩ searchEntries with same name dedup to one
402 PASS local entries precede fuzzy search hits, no dupes
403 PASS empty fragment includes every entry (legacy behavior preserved)
404 PASS external display name participates in filtering while preserving token path
405 PASS external entries with the same submitted path dedup to one
406
407 7 passed, 0 failed
408
409
410 ▶ src/__tests__/attachment-display.test.ts
411
412 attachment display
413 PASS removes named display refs from message text
414 PASS preserves original display names for attachment cards
415 PASS sorts images before files while keeping groups stable
416 PASS compact previews use named display refs
417 PASS restores named display refs for submit
418 PASS formats attachment display refs for edit replay
419 PASS formats raw attachment refs for edit replay submit
420 PASS extracts Windows path basenames
421 PASS extracts POSIX path basenames
422 PASS removes an escaped workspace ref from message text
423 PASS escaped workspace ref becomes one full badge with the unescaped path
424 PASS workspace display refs escape whitespace for lossless edit replay
425 PASS workspace submit refs escape whitespace so @-token parsing resolves them
426
427 13 passed, 0 failed, 13 total
428
429 ▶ src/__tests__/automation-drafts.test.ts
430 PASS automation draft merge, conflict, engine state, locking, stale completion and deletion contracts
431
432 ▶ src/__tests__/automation-management.test.tsx
433 PASS automation page/filter retention, save-switch race, failure and unmount draft retention
434
435 ▶ src/__tests__/automation-navigation-lifecycle.test.tsx
436 automation navigation: accepted-target return, page ABA, exact finally and disposal passed
437
438 ▶ src/__tests__/automation-regions.test.tsx
439 An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string.
440 An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string.
441 An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string.
442 An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string.
443 automation regions: shared layout page projection passed
444
445 ▶ src/__tests__/automation-surface-layout.test.ts
446 PASS shared management geometry, input isolation, terminal retention and native titlebar dispatch
447
448 ▶ src/__tests__/bench-hydration-delay.test.ts
449 PASS only the explicit memory soak omits synthetic latency; browser/native fixtures keep delayed hydration
450
451 ▶ src/__tests__/blank-project-dialog.test.tsx
452
453 blank project creation
454 PASS empty names are rejected before IPC
455 PASS nested paths are rejected before IPC
456 PASS a single folder name is accepted
457 PASS creation uses an accessible modal dialog
458 PASS the chosen parent folder is shown before creation
459 PASS project name receives initial focus
460 PASS create stays disabled until the name is valid
461 PASS a valid project name enables creation
462 PASS submission trims and forwards the project name
463 PASS Escape cancels the dialog
464 PASS workbench menu starts the blank-project flow
465 PASS the dialog delegates atomic directory creation to Go
466 PASS the new directory reuses workspace navigation and registration
467 PASS the creation flow stays outside the startup bundle
468 PASS the live flow picks, creates, opens, refreshes, and closes in order
469
470 15 passed, 0 failed
471
472 ▶ src/__tests__/bot-connection-settings.test.ts
473 bot connection settings: DingTalk label passed
474
475 ▶ src/__tests__/bridge-breadcrumbs.test.ts
476
477 bridge breadcrumbs
478 PASS records bridge start and completion timing breadcrumbs
479 PASS records bridge start breadcrumb before failed calls
480 PASS records bridge failure timing breadcrumbs
481
482 3 passed, 0 failed
483
484 ▶ src/__tests__/bridge-mock-approval-mode.test.ts
485
486 bridge mock approval mode
487 PASS legacy plan switch keeps explicit auto approval mode
488 PASS legacy normal switch keeps explicit auto approval mode
489 PASS legacy yolo switch still enables yolo approval mode
490 PASS legacy non-yolo switch clears yolo back to ask
491
492 4 passed, 0 failed
493
494 ▶ src/__tests__/browser-control-settings.test.tsx
495 browser control settings page
496
497 ▶ src/__tests__/browser-dock-mode.test.tsx
498
499 browser dock mode
500 browser dock mode: gating, tab render and lazy mount passed
501
502 ▶ src/__tests__/browser-panel-store.test.ts
503
504 browser panel store
505 PASS tab projection per task, activation sync and detach
506 PASS address submission, draft lifecycle, open, zoom and close
507 PASS host errors are surfaced through the bound notifier
508 PASS download strip bookkeeping
509 PASS address normalisation
510 PASS zoom presets
511 browser panel store: all checks passed
512
513 ▶ src/__tests__/browser-panel.test.tsx
514
515 browser panel
516 browser panel: empty, loading, error, take-over, downloads, keyboard and toast states passed
517
518 ▶ src/__tests__/browser-surface-layout.test.ts
519
520 browser surface layout
521 PASS rect math, dedupe, ancestor scroll, resize and detach
522 PASS overlay gate follows [data-app-overlay] presence
523 browser surface layout: all checks passed
524
525 ▶ src/__tests__/bundle-contract.test.ts
526
527 bundle contract
528 PASS App keeps session export code out of the initial chunk
529 PASS App loads session export code on demand
530 PASS App keeps secondary drawers out of the initial chunk
531 PASS Overlay Host owns lazy secondary drawer imports without an eager runtime edge
532 PASS App keeps the project tree out of the first-paint bundle
533 PASS Sidebar Region owns the lazy project tree import without an eager runtime edge
534 PASS Workspace dock owns the lazy browser panel import without an eager runtime edge
535 PASS Recovery worker stays behind the synchronous resync listener without an eager runtime edge
536 PASS Fork actions load with message actions while the bridge imports only their mock implementation
537 PASS Settings CSS stays in the lazy production entry without breaking direct module tests
538 PASS Remote wizard CSS stays in its lazy production entry without breaking direct module tests
539 PASS App has no dedicated history-page entry points
540 PASS Trash and existing session search remain available
541 PASS Workbench footer distributes its three utility actions evenly
542 PASS Creation footer distributes search, trash, and settings evenly
543 PASS SettingsPanel keeps secondary settings pages out of the first settings chunk
544 PASS SettingsPanel loads secondary settings pages on demand
545 PASS SettingsPanel keeps QR rendering code out of the first settings chunk
546 PASS SettingsPanel loads QR rendering code on demand
547 PASS Markdown wrapper keeps markdown/math vendor code out of the initial chunk
548 PASS Markdown wrapper loads markdown renderer on demand
549 PASS Markdown local-path support avoids RegExp lookbehind required by newer WebKit
550 PASS i18n keeps Chinese dictionaries out of the unconditional initial chunk
551 PASS i18n loads Chinese dictionaries on demand
552 PASS main preloads the detected locale before mounting React
553
554 25 passed, 0 failed
555
556 ▶ src/__tests__/capabilities-panel-actions.test.ts
557 capabilities panel MCP actions
558
559 ▶ src/__tests__/capability-busy-notice.test.ts
560
561 ▶ src/__tests__/chat-content-loader.test.ts
562 chat content: concurrency, deduplication, generation and cleanup races passed
563
564 ▶ src/__tests__/chat-details-race.test.tsx
565 tool details: old target completion cannot overwrite the current drawer; session replacement closes details
566
567 ▶ src/__tests__/chat-natural-flow.test.tsx
568 chat natural flow: process disclosure, details, 60-commit cascade and session isolation passed
569
570 ▶ src/__tests__/chat-scroll-controller.test.ts
571 chat scroll: reader intent, prepend, growth, jump, no-op and stale observer tests passed
572
573 ▶ src/__tests__/chat-view-source.test.ts
574 chat view: stable streaming, settlement, prepend, fold, incomplete history and disposal passed
575
576 ▶ src/__tests__/checkpoint-turn-event.test.ts
577
578 turn checkpoint submission binding
579 PASS submission correlation is tab-scoped
580 PASS submission correlation changes across session reset
581 PASS submission correlation changes across runtime epoch
582 PASS submission correlation changes across local sequence
583 PASS render item id and opaque submission correlation stay distinct
584 PASS turn zero is assigned by exact submission id
585 PASS TurnDone clears the settled item's correlation
586 PASS matching TurnDone confirms the optimistic submit
587 PASS intervening items cannot change the target
588 PASS TurnDone without submission id cannot stamp a local user
589 PASS id-less TurnDone cannot confirm a pending submission
590 PASS unknown submission id cannot rewrite another user
591 PASS matching checkpoint-less TurnDone still settles the correlation
592 PASS duplicate TurnDone cannot backfill a settled checkpoint-less turn
593 PASS successful local command Promise confirms its exact correlation
594 PASS management command stays non-rewindable
595 PASS the next normal turn maps independently after a no-TurnDone command
596 PASS an older history revision cannot replace the current transcript projection
597 PASS old-id runtime activity cannot confirm the new pending user
598 PASS matching non-TurnDone activity confirms the pending user
599 PASS uncorrelated extension activity cannot confirm a pending user
600 PASS exactly correlated extension activity confirms the pending user
601 PASS a missing A TurnDone does not consume B ownership
602 PASS B maps by id even when A TurnDone never arrives
603 PASS late A TurnDone still maps exact A
604 PASS late A TurnDone cannot stamp B
605 PASS late A TurnDone cannot confirm B pending state
606 PASS late A TurnDone cannot flush B pending text
607 PASS B later receives its own checkpoint
608 PASS A maps before B rejection
609 PASS B rejection marks only B
610 PASS failed B remains non-rewindable
611 PASS C maps normally after the rejected B gap
612 PASS out-of-order A completion still maps A
613 PASS out-of-order B completion still maps B
614 PASS shell TurnDone without submission id stays non-rewindable
615 PASS shell completion cannot offset the following normal turn
616 PASS error TurnDone maps an admitted checkpoint by id
617 PASS error TurnDone still surfaces its warning
618 PASS first equal-text user keeps its checkpoint
619 PASS second equal-text user maps independently by id
620 PASS stale send_failed is a complete no-op for a newer pending id
621 PASS current send_failed marks the exact pending user
622 PASS send_failed clears the rejected item's correlation
623 PASS current send_failed cannot mark an older user
624 PASS send_failed after matching TurnDone is a complete no-op
625 PASS late failure cannot erase an assigned checkpoint
626 PASS duplicate TurnDone cannot overwrite an existing checkpoint
627 PASS session reset removes the old optimistic id target
628 PASS controller rebuild retires the old item correlation
629 PASS late pre-rebuild TurnDone cannot stamp the retired item
630 PASS old-runtime failure cannot clear the rebuilt runtime pending correlation
631 PASS post-rebuild submission maps normally
632 PASS history prepend preserves the exact live item target
633 PASS recent history keeps authoritative metadata
634 PASS prepended history keeps authoritative metadata
635 PASS unknown local id cannot rewrite hydrated history
636 PASS FIFO ownership state is completely removed
637 PASS TurnDone hot path does not refresh full checkpoint history
638 PASS positional checkpoint merge action remains removed
639 PASS TurnDone still refreshes checkpoint metadata
640
641 61 passed, 0 failed, 61 total
642
643 ▶ src/__tests__/checkpoint-turn-transcript.test.tsx
644 chat branches: checkpoint identity, fork command and capability gates passed
645
646 ▶ src/__tests__/clear-session-identity-contract.test.ts
647 PASS clear-session identity contract
648
649 ▶ src/__tests__/clear-session-identity-race.test.ts
650
651 clear-session identity race
652 PASS matching path+generation is current
653 PASS path drift after clear is rejected
654 PASS generation-only drift after clear is rejected
655 PASS empty load path does not false-reject
656 PASS after clear, transcript is empty before late A returns
657 PASS after clear, generation is B
658 PASS late A hydrate is not applied after clear to B
659 PASS transcript remains empty after rejected late A
660 PASS live identity path stays B
661 PASS live identity generation stays B
662
663 10 passed, 0 failed
664
665 ▶ src/__tests__/code-block-copy-position.test.tsx
666
667 code block copy position
668 PASS HljsCode renders a positioned copy wrapper
669 PASS HljsCode renders the highlighted pre
670 PASS HljsCode renders the copy button
671 PASS scrollable pre is inside the wrapper
672 PASS copy button is a wrapper child
673 PASS copy button is outside the scrollable pre
674 PASS copy button follows pre as a sibling
675 PASS hover reveal targets the wrapper
676 PASS hover reveal no longer depends on pre descendants
677 PASS creation unlabelled code button styles target sibling copy buttons
678 PASS creation unlabelled code styles do not target descendants inside pre
679 PASS creation shell code button styles target sibling copy buttons
680 PASS creation shell code styles do not target descendants inside pre
681
682 13 passed, 0 failed
683
684 ▶ src/__tests__/command-palette-css.test.ts
685
686 command palette css
687 PASS palette result rows stay in flex layout
688 PASS palette result rows keep icon and text side-by-side
689 PASS palette text body can shrink before ellipsis
690 PASS .palette__title clips overflow inside the row
691 PASS .palette__title uses ellipsis for long text
692 PASS .palette__title stays on one measured line
693 PASS .palette__hint clips overflow inside the row
694 PASS .palette__hint uses ellipsis for long text
695 PASS .palette__hint stays on one measured line
696 PASS no palette item rule can stack icon above long session text
697
698 10 passed, 0 failed
699
700 ▶ src/__tests__/command-palette-interactions.test.tsx
701
702 command palette interactions
703 PASS header esc keycap is a real close button
704 PASS clicking header esc closes the command palette
705 PASS clicking header esc does not run the highlighted command
706 PASS Enter on focused header esc closes the command palette
707 PASS Enter on focused header esc does not run the highlighted command
708
709 5 passed, 0 failed
710
711 ▶ src/__tests__/committed-command-execution.test.tsx
712 PASS committed capture/executor separates source input from lifecycle-owned effects
713
714 ▶ src/__tests__/committed-command-lifecycle.test.tsx
715 PASS unmount revokes command authority synchronously
716 PASS normal passive setup does not invalidate layout-started work
717
718 ▶ src/__tests__/completed-turn-telemetry.test.ts
719 completed-turn telemetry: all assertions passed
720
721 ▶ src/__tests__/completion-summary-presentation.test.ts
722 turn result truth, stable identity, concurrent checks, phases and history passed
723
724 ▶ src/__tests__/completion-summary-ui.test.tsx
725
726 completion summary UI
727 PASS completion results remain ordinary records outside folds
728 PASS record preserves its explanation
729 PASS older result preserves its own details
730 PASS newer result preserves its own details
731 PASS retired delivery and verification actions are absent
732
733 5 passed, 0 failed
734
735 ▶ src/__tests__/composer-autosize-scrollbar-css.test.ts
736
737 composer autosize scrollbar css
738 PASS autosize textarea hides the scrollbar while content fits
739 PASS autosize textarea hides the webkit scrollbar while content fits
740 PASS overflowing autosize textarea restores the thin scrollbar
741 PASS overflowing autosize textarea restores the webkit scrollbar
742 PASS overflowing autosize scrollbar matches the resized-card width
743 PASS hero input cap is min(30vh, 160px) instead of the 96px hard clip
744 PASS autosize mirror stays outside the composer layout flow
745 PASS autosize mirror is never visible to the user
746 PASS Composer wires the auto-overflow modifier to the autosize overflow state
747 PASS hero input JS cap is min(30vh, 160px)
748 PASS Composer renders a text-synchronized, accessibility-hidden measurement mirror
749 PASS autosize measurement never collapses the live textarea
750
751 12 passed, 0 failed
752
753 ▶ src/__tests__/composer-content-sizing.test.ts
754
755 composer content sizing
756 PASS automatic composer follows its content height
757 PASS automatic composer keeps natural card sizing
758 PASS automatic composer stays overflow-free below the cap
759 PASS manual height remains the minimum input baseline
760 PASS short content does not shrink below the manual baseline
761 PASS content can grow beyond the manual input baseline
762 PASS manual composer grows to reveal the longer draft
763 PASS growing content remains visible before the cap
764 PASS manual composer input stops at the viewport-aware cap
765 PASS manual composer card stops at the logical maximum
766 PASS content scrolls internally only after reaching the cap
767 PASS deleting content returns the composer to its manual baseline
768
769 12 passed, 0 failed
770
771 ▶ src/__tests__/composer-context-menu-clipboard.test.tsx
772 PASS undo hint uses the platform modifier
773 PASS redo hint uses the platform modifier
774 PASS cut hint uses the platform modifier
775 PASS paste hint uses the platform modifier
776 PASS no hardcoded mac glyph on a non-mac platform
777 PASS undo is enabled at a programmatic edit boundary
778 PASS redo is disabled before an undo
779 PASS context-menu undo restores the previous composer text
780 PASS older programmatic history remains undoable
781 PASS redo is enabled after context-menu undo
782 PASS context-menu redo restores the undone composer edit
783 PASS failed cut must not delete the selection
784 PASS successful cut removes the selected text
785 [composer] failed to read native clipboard image Error: no native clipboard image
786 at SaveClipboardImage (<repo>/desktop/frontend/src/__tests__/composer-context-menu-clipboard.test.tsx:228:13)
787 at Object.invoke (<repo>/desktop/frontend/src/__tests__/desktopHostStub.ts:94:31)
788 at Proxy.<anonymous> (<repo>/desktop/frontend/src/lib/desktopHost.ts:205:106)
789 at <anonymous> (<repo>/desktop/frontend/src/lib/bridge.ts:996:91)
790 at maybeShare (<repo>/desktop/frontend/src/lib/queryCoalesce.ts:63:12)
791 at Proxy.<anonymous> (<repo>/desktop/frontend/src/lib/bridge.ts:996:24)
792 at attachNativeClipboardImage (<repo>/desktop/frontend/src/components/Composer.tsx:2369:30)
793 at pasteIntoComposer (<repo>/desktop/frontend/src/components/Composer.tsx:2710:42)
794 PASS empty-clipboard paste must not erase the selection
795 PASS text paste replaces the selection
796
797 15 passed, 0 failed, 15 total
798
799 ▶ src/__tests__/composer-followup-confirmation.test.tsx
800 PASS: uncertain follow-up stays bound across phases, selection, edits, and remounts
801 PASS: same-topic sessions, late receipts, and unbound paths preserve request ownership
802
803 ▶ src/__tests__/composer-goal-toggle.test.tsx
804
805 composer goal toggle
806 PASS plain composer disables browser text assistance
807 PASS insert request populates the composer draft
808 PASS prefix insert preserves the draft as a subagent task
809 PASS prefix insert does not send the subagent task
810 PASS default execution has no mode chip
811 PASS task method menu exposes only Plan and Goal
812 PASS task method menu does not present independent switches
813 PASS Plan menu keeps a single-line label
814 PASS Plan menu does not present Plan as a read-only permission mode
815 PASS enabling goal mode with a draft does not send
816 PASS enabling goal mode switches only the collaboration axis
817 PASS enabling goal mode preserves the prefixed draft text
818 PASS Plan exposes its active mode chip
819 PASS selecting active Plan exits to the implicit default
820 PASS exiting Plan preserves the draft
821 PASS clicking the mode chip exits Plan directly
822 PASS dismissing the chip preserves the draft
823 PASS a skill alone cannot become the initial goal
824 PASS a skill-only initial goal asks for task text
825 PASS the initial goal keeps its visible task text
826 PASS the initial goal preserves the selected skill
827 PASS the initial goal sends structured skill input
828 PASS the initial goal submits the selected skill entity
829 PASS a pasted skill invocation keeps its task as the visible goal
830 PASS a pasted skill invocation keeps its slash display
831 PASS a pasted skill invocation uses structured input
832 PASS a pasted skill invocation resolves the selected command
833 PASS attachment-only input can become the initial Goal
834 PASS attachment-only initial Goal submits the attachment ref
835 PASS attachment-only initial Goal is not a structured skill submit
836 PASS workspace-ref-only input can become the initial Goal
837 PASS workspace-ref-only initial Goal submits the workspace ref
838 PASS workspace-ref-only initial Goal is not a structured skill submit
839 PASS long rich-composer paste folds into a pasted block
840 PASS expanding a pasted block removes its folded control
841 PASS expanding folded text shifts the following invocation to the end of the expanded content
842 PASS removing folded text restores the following invocation offset
843 PASS trimmed structured submission keeps the normalized following invocation offset
844 PASS rich composer disables browser text assistance
845 PASS paste after an invocation inserts on the token's right side
846 PASS rich composer exposes the shared edit context menu
847 PASS rich composer context-menu undo is enabled after paste
848 PASS rich composer context-menu redo is disabled before undo
849 PASS rich composer context-menu undo removes the pasted text
850 PASS rich composer context-menu redo is enabled after undo
851 PASS rich composer context-menu redo restores the pasted text
852 PASS Ctrl+Z restores the rich-composer paste transaction
853 PASS paste undo restores the caret after the invocation token
854 PASS Backspace after paste undo removes the invocation on the caret's left
855 PASS task method trigger exposes an active goal
856 PASS running goal offers a pause action
857 PASS explicit stop action clears the active goal
858 PASS stopping a goal does not race a second mode update
859 PASS dismissing an active goal chip uses the existing clear-goal action
860 PASS goal-mode stop cancels the running turn
861 PASS goal-mode stop clears the active goal
862 [composer] failed to attach pasted file
863 PASS SavePastedFile rejection shows a visible error
864 PASS failed pasted file attach preserves composer text
865 PASS failed pasted file attach clears the pending state
866 PASS pasted file failure toast does not expose the local path
867 PASS successful pasted file attach still renders the attachment
868 [composer] failed to attach dropped file
869 PASS AttachDropped rejection shows a visible error
870 PASS failed dropped file attach preserves composer text
871 PASS failed dropped file attach clears the pending state
872 PASS dropped file failure toast does not expose the local path
873 PASS successful dropped file attach still renders the attachment
874 PASS dropped external folder renders as a folder context chip
875 PASS external folder display text uses the real folder path
876 PASS external folder submit text uses the session ref token
877 PASS external search selection removes the token fragment from the draft
878 PASS external search selection submits the session ref token
879 PASS external search selection keeps the real display path
880 PASS local file selection still completes inline text
881 PASS local dir selection still keeps the menu-open slash
882 PASS file selection ignores an invisible trailing newline
883 PASS native file drop prevents browser image navigation
884 PASS outer native file drop target prevents browser image navigation
885 PASS rejected submit attempts the send once
886 PASS rejected submit preserves the composer draft
887 PASS successful submit attempts the send once
888 PASS successful submit clears the composer draft
889 PASS running guidance preview shows a compact queue preview
890 PASS guidance preview shows the first seeded item
891 PASS guidance preview shows the second seeded item
892 PASS guidance preview exposes a guide action for each visible item
893 PASS guidance preview summarizes overflow items
894 PASS guidance overflow starts collapsed
895 PASS guidance overflow expands the remaining queued items
896 PASS expanded guidance preview shows the hidden item
897 PASS expanded guidance overflow can be collapsed
898 PASS guidance overflow reports expanded state
899 PASS guidance overflow collapses back to the compact preview
900 PASS guidance preview refreshes when the seed changes
901 PASS guidance preview renders the refreshed seed
902 PASS guidance preview clears when the mock turn stops
903 PASS running composer explains queued guidance input
904 PASS running composer marks send button as steer
905 PASS running steer button stays disabled without input
906 PASS running steer button enables after text input
907 PASS running composer queues guidance without sending it immediately
908 PASS queued running guidance clears the composer draft
909 PASS running guidance chip shows queued text
910 PASS running guidance shelf shows queued count
911 PASS guide attempts admission with the existing durable item ID
912 PASS guide never opens a duplicate frontend submit
913 PASS accepted durable steer clears after backend admission
914 PASS dismiss deletes the durable backend item before clearing the shelf
915 PASS running guidance chip can be dismissed
916 PASS running guidance chip renders again after another queued item
917 PASS running guidance chip clears when steer is consumed
918 PASS running guidance chip renders before turn stop
919 PASS running guidance chip clears when the turn stops
920 PASS running guidance queue ignores controller submitDisabled
921 PASS running guidance queues while controllerReady is false
922 PASS queued durable item can be guided while controllerReady is false
923 PASS controllerReady gap does not create a duplicate submit
924 PASS late guidance attempts one strict steer admission
925 PASS rejected steer does not open a provider turn
926 PASS rejected steer remains queued
927 PASS late durable follow-up is never resubmitted by the frontend
928 PASS queuing while running does not send immediately
929 PASS queued message shows in the guidance shelf
930 PASS natural completion never triggers a duplicate frontend submit
931 PASS durable body remains backend-owned through dispatch
932 PASS stop scopes backend discard to the Composer-owned durable ID
933 PASS stop clears the local shelf after handing off durable IDs
934 PASS stop restores queued guidance to the editable draft
935 PASS queued message shows in the guidance shelf
936 PASS auto-send does not fire while the controller is still activating
937 PASS queued message stays on the shelf while not ready
938 PASS controller readiness never triggers frontend auto-submit
939 PASS durable item remains until backend consume/ack
940 PASS backend consume event clears the acknowledged item
941 PASS @ directory cache hit still revalidates ListDir
942 PASS @ directory requests stay scoped to the composer tab
943 PASS fileRefRefreshKey refreshes @ directory cache while the menu is open
944 PASS @ search fetches the first query
945 PASS @ search cache is reused inside the TTL
946 PASS @ search cache revalidates after the TTL
947 PASS stale @ directory request cannot repopulate cache after refresh
948 PASS same-tab A→B→A keeps the current composer file-ref search cache
949 PASS first middle skill selection preserves surrounding text
950 PASS middle skill selection keeps its configured color
951 PASS paste after a middle skill preserves the entity and suffix
952 PASS paste after a middle skill keeps the selected entity
953 PASS a second skill can be inserted after existing text and an entity
954 PASS middle skills submit the surrounding task text without slash tokens
955 PASS multiple middle/end skills submit in visual order
956 PASS first middle skill keeps its text offset
957 PASS slash menu ignores an invisible trailing newline
958 PASS file menu ignores an invisible trailing newline
959 PASS slash argument completion removes an invisible trailing newline before lookup
960 PASS new subagent command is absent before runtime refresh
961 PASS runtime rebuild refetches subagent slash commands
962 PASS short skill query keeps one group heading and both matching plugin names
963 PASS selecting a plugin skill switches to the rich task input
964 PASS selected skill renders as composer context
965 PASS selected plugin skill keeps its source visible
966 PASS selected skill is an inline task entity
967 PASS selected skill keeps a caret anchor after the inline entity
968 PASS clicking blank rich-composer space focuses the editable task input
969 PASS Backspace removes a selected skill from an empty task input
970 PASS removing the last entity hands focus to the textarea that replaces the rich input
971 PASS Ctrl+Z restores a token removed by the rich composer
972 PASS undoing the programmatic Backspace restores the selected skill
973 PASS Ctrl+Shift+Z redoes rich token removal
974 PASS redoing the programmatic Backspace removes the selected skill again
975 PASS inline skill-only invocation enables submit
976 PASS inline skill-only submission retains display metadata
977 PASS inline skill-only submission sends an empty explicit task
978 PASS inline skill-only submission preserves reloadable invocation display metadata
979 PASS inline skill-only submission sends a structured skill entity
980 PASS selected skill keeps the visible transcript text clean
981 PASS selected skill preserves invocation display metadata
982 PASS selected skill sends task text separately from invocation metadata
983 PASS selected skill clears after send
984 PASS management commands keep the existing inline argument flow
985 PASS management commands do not become selected abilities
986 PASS selected custom subagent uses its configured color
987 PASS subagent-only invocation remains blocked until a task is entered
988 PASS rich composer does not duplicate ordinary browser input
989 PASS rich composer does not duplicate committed IME input
990 PASS external replacement can restore the initially rendered rich-composer text
991 PASS subagent task is sent exactly once after rich input
992 PASS structured subagent input contains one task copy
993 PASS restored history renders the selected skill header
994 PASS restored history retains plugin source from the qualified command
995 PASS history message keeps slash syntax out of the task body
996 PASS history and trash previews recover selected abilities after referenced-session context
997 PASS restored custom subagents keep their command type styling
998 PASS restored custom subagents keep their configured color
999 PASS history recovery ignores slash-prefixed lines inside the task body
1000 PASS ordinary referenced-session text does not turn task slash lines into a skill header
1001 PASS typing # opens recent sessions and carries the query across an invisible trailing newline
1002 PASS the typed # flow leaves focus in the composer instead of the panel search box
1003 PASS Escape closes the typed recent-session picker and keeps the literal # text
1004 PASS Escape dismisses the typed recent-session panel until the query changes
1005 PASS an embedded hash remains ordinary composer text
1006 PASS selecting a typed recent-session reference removes the # token
1007 PASS selecting a typed recent-session reference adds its context card
1008 PASS plus trigger opens the add-content menu
1009 PASS add-content menu exposes four focused actions
1010 PASS attachment action uses the file attachment icon
1011 PASS workspace action uses the mention icon
1012 PASS recent-session action uses the history reference icon
1013 PASS command action uses the literal slash trigger icon
1014 PASS add-content actions remain one unified group without a divider
1015 PASS add-content actions do not duplicate their trigger icons on the right
1016 PASS attachment action reuses the existing file-save path
1017 PASS opening add-content closes the active suggestion panel
1018 PASS add-content remains the only open composer surface
1019 PASS recent-session action inserts # at the remembered caret
1020 PASS recent-session picker replaces the add-content menu
1021 PASS Escape closes the direct recent-session picker and keeps the inserted # trigger
1022 PASS command action inserts / at the caret
1023 PASS command action is disabled while the composer has text
1024 PASS disabled command action does not insert / into existing text
1025 PASS content menu stays closed after the run ends
1026 PASS recent-session picker stays closed after the run ends
1027 PASS an entity-only submit while running queues instead of sending
1028 PASS the queued guidance shows the entity's slash form instead of dropping it silently
1029 PASS queued guidance preserves the selected skill invocation
1030 PASS entity-only guidance keeps an empty explicit task instead of degrading to slash text
1031 PASS queueing an entity-only submit clears the draft
1032 PASS composition input neither resyncs the model nor restores the selection
1033 PASS compositionend commits the composed text to the model exactly once
1034 PASS switching back restores session A slash draft
1035 PASS restoring a draft recomputes slash completion from its end caret
1036 PASS switching back restores the rich invocation draft
1037 PASS restoring a rich invocation draft recomputes slash completion from its end caret
1038 PASS the restored rich slash query can select a second skill
1039 PASS selecting the restored query replaces its slash token
1040 PASS switching away again preserves the other session draft
1041
1042 233 passed, 0 failed, 233 total
1043
1044 ▶ src/__tests__/composer-history.test.ts
1045
1046 composerHistory
1047 PASS returns 1 entry
1048 PASS correct text
1049 PASS first call returns entry
1050 PASS first call hits backend
1051 PASS cache hit returns cached entry
1052 PASS cache hit keeps cached text
1053 PASS second snapshot reads loaded tape entries
1054 PASS after invalidate re-fetches
1055 PASS after invalidate, backend called
1056 PASS first page text
1057 PASS second page text
1058 PASS snapshot contains loaded tape pages
1059 PASS first request has empty cursor
1060 PASS second request uses older cursor
1061 PASS first ArrowUp press sees 3 history entries
1062 PASS first recalled prompt is the newest entry
1063 PASS cache hit returns cached history
1064 PASS cache hit keeps newest first
1065 PASS after invalidation first ArrowUp can still recall again
1066 PASS after invalidation still recalls newest first
1067 PASS array result is supported
1068 PASS array result text
1069 PASS tuple result is supported
1070 PASS tuple result text
1071 PASS map tuple result is supported
1072 PASS map tuple result text
1073 PASS null result is supported
1074 PASS tuple first call returns entry
1075 PASS tuple cache hit returns cached entry
1076 PASS tuple cache hit keeps cached text
1077 PASS snapshot reuses loaded tape entries
1078 PASS empty on error
1079 PASS calls backend once after invalidate
1080 PASS nonce is '' after invalidate
1081 PASS push/clear do not throw
1082
1083 35 passed, 0 failed, 35 total
1084
1085 ▶ src/__tests__/composer-image-capability.test.tsx
1086
1087 composer image capability
1088 PASS text-only model stores pasted image attachments as tool-readable refs
1089 PASS text-only model keeps the pasted image attachment in the draft
1090 PASS text-only image attach does not warn before send
1091 PASS image attach warning does not render inside the composer layout
1092 PASS vision-capable model keeps the pasted image attachment
1093 PASS model switch alone does not show a warning toast
1094 PASS switching to a text-only model still sends the image ref for tool use
1095 PASS text-only send points to the image-understanding setting
1096 PASS image-input warning does not render inside the composer layout
1097 PASS submitted text retains the local image attachment ref
1098 PASS configured image-understanding fallback still sends the image turn
1099 PASS configured image-understanding fallback suppresses the obsolete warning
1100 PASS composer image thumbnail opens the image viewer
1101 PASS composer image viewer closes on Escape
1102 PASS sent message image preview portals into the chat pane
1103 PASS sent message image viewer closes from the close button
1104 PASS sent messages expose copy without the retired edit entry
1105 PASS sent image thumbnail remains previewable without message editing
1106
1107 18 passed, 0 failed, 18 total
1108
1109 ▶ src/__tests__/composer-ime.test.tsx
1110
1111 composer plain textarea IME freeze
1112 PASS unrelated re-render mid-composition keeps the provisional text
1113 PASS composition input keeps flowing without a DOM clobber
1114 PASS Enter during composition does not send
1115 PASS committed IME text is intact after compositionend
1116 PASS caret sits after the committed character
1117 PASS Enter inside the post-composition grace window does not send
1118 PASS Enter after the grace window sends
1119 PASS the sent text is the committed IME text
1120 PASS provisional text is live during composition
1121 PASS IME cancel restores the pre-composition text
1122 PASS typing after an IME cancel keeps working
1123 PASS composition is in flight before the programmatic insert
1124 PASS programmatic insert forces a resync and reaches the DOM mid-composition
1125 PASS the programmatic resync ends the freeze so Enter sends
1126 PASS the sent text carries the programmatic insert
1127
1128 15 passed, 0 failed
1129
1130 ▶ src/__tests__/composer-inbox-interleaving.test.tsx
1131
1132 composer inbox interleaving
1133 PASS an early consume event prevents the late enqueue receipt from resurrecting guidance
1134 PASS session B stop stays enabled while session A cancellation settles
1135 PASS session B can issue its own stop while session A cancellation settles
1136
1137 3 passed, 0 failed, 3 total
1138
1139 ▶ src/__tests__/composer-inbox-recovery.test.tsx
1140
1141 composer inbox recovery
1142 PASS banner reports recovered count
1143 PASS queue starts with bounded preview
1144 PASS review action expands the recovered queue
1145 PASS keep paused confirms the server-side pause
1146 PASS keep paused preserves the resume path
1147 PASS confirmed pause is visible and idempotent
1148 PASS continue resumes the durable inbox
1149 PASS successful resume clears the recovery banner
1150 PASS stale snapshot cannot show recovery controls on another session
1151 PASS coded paused error renders in the active Chinese locale
1152 PASS non-recovered pause exposes an actionable pause banner
1153 PASS paused inbox disables guide admission instead of surfacing a backend error
1154 PASS continue resumes a non-recovered paused inbox
1155 PASS idle FIFO head exposes an explicit send fallback
1156 PASS idle send fallback has an accessible label
1157 PASS idle non-head guidance remains disabled to preserve FIFO order
1158 PASS idle non-head guidance explains the FIFO gate
1159 PASS idle send re-kicks the Controller drain without changing pause state
1160 PASS idle send never attempts active-turn steering
1161 PASS active steer disables send and delete actions
1162 PASS active steer explains why actions are disabled
1163 PASS active steer never sends invalid backend operations
1164 PASS consumed steer is excluded from the pending guidance shelf
1165 PASS consumed steer cannot reappear after inbox refresh
1166 PASS uncertain idle guidance exposes an explicit retry action
1167 PASS retry action has a state-aware accessible label
1168 PASS idle retry requeues through the Controller without an invalid steer
1169 PASS busy retry requeues before attempting active-turn admission
1170 PASS pause banner hides while guidance is already being applied
1171 PASS edit mode loads the queued text
1172 PASS edit saves through UpdateInboxItem
1173 PASS review path hydrates an empty snapshot preview
1174 PASS session A shows its own recovered inbox
1175 PASS sibling session does not inherit the previous recovered banner
1176 PASS sibling session does not inherit the previous queued guidance
1177 PASS stale recovered snapshot cannot land on another session
1178 PASS stale queued items cannot land on another session
1179 PASS consumed steer uses item ID for long duplicate text
1180 PASS running and consumed items stay out of the pending queue
1181 PASS recovery count reflects visible pending items
1182 PASS stop restores only backend-confirmed withdrawn messages
1183 PASS non-withdrawn durable message remains backend-owned
1184 PASS read-only queue disables delete
1185 PASS finishing is visibly announced from shared state after TurnDone
1186 PASS finishing does not animate as model execution
1187 PASS finishing hides current-turn stop
1188 PASS uncertain queue failure retains draft and makes one request
1189 PASS explicit retry only looks up the original idempotency key
1190 PASS durable queue receipt clears the complete submitted draft
1191 PASS finishing neither directly submits nor cancels
1192
1193 50 passed
1194
1195 ▶ src/__tests__/composer-insert-commands.test.tsx
1196 composer insert commands: routing, plan-revision target, selection trimming and terminal output chains passed
1197
1198 ▶ src/__tests__/composer-keyboard.test.ts
1199
1200 composerKeyboard
1201 PASS ArrowUp maps to history up
1202 PASS ArrowDown maps to history down
1203 PASS PageUp does not map to history
1204 PASS Home does not map to history
1205 PASS legacy unidentified keyCode 38 maps up
1206 PASS Fn key is detected
1207 PASS Fn modifier is detected
1208 PASS empty input ArrowUp can recall history
1209 PASS empty input ArrowDown does not start history
1210 PASS ArrowUp at draft end keeps native textarea movement
1211 PASS ArrowUp at first position recalls history
1212 PASS ArrowDown at recalled history end moves newer
1213 PASS ArrowDown inside text keeps native movement
1214 PASS ArrowUp inside multiline text keeps native movement
1215 PASS history mode allows repeated ArrowUp
1216 PASS Fn-modified arrows are not history shortcuts
1217 PASS Shift+Arrow preserves selection behavior
1218
1219 composerEnterAction
1220 PASS plain Enter sends by default
1221 PASS Shift+Enter keeps the native line break by default
1222 PASS Ctrl+Enter keeps the legacy default send behavior
1223 PASS Cmd+Enter keeps the legacy default send behavior
1224 PASS Alt+Enter keeps the legacy default send behavior
1225 PASS non-Enter keys are ignored
1226 PASS custom Ctrl+Enter inserts a newline manually
1227 PASS Shift+Enter does nothing once the newline chord moved to Ctrl+Enter
1228 PASS plain Enter still sends with a custom newline chord
1229 PASS custom Ctrl+Enter sends (WeChat-style layout)
1230 PASS plain Enter breaks the line when the send chord moved to Ctrl+Enter
1231 PASS Shift+Enter still breaks the line in the WeChat-style layout
1232 PASS a custom send chord disables legacy modified-Enter aliases
1233 PASS reset restores plain-Enter send
1234 PASS reset restores the Shift+Enter default
1235
1236 composerEscapeAction / IME gating
1237 PASS Escape passes through while composition is active
1238 PASS plain Escape cancels a running turn
1239 PASS Escape does not cancel an idle composer
1240 PASS non-Escape keys do not trigger cancellation
1241
1242 composerMenuKeyAction / IME gating
1243 PASS IME Escape stays with the input
1244 PASS IME Enter stays with the input
1245 PASS IME ArrowDown stays with the input
1246 PASS plain Escape is handled by the menu
1247 PASS plain Enter is handled by the menu
1248 PASS typing keys pass through menu navigation
1249 PASS native isComposing protects IME Escape
1250 PASS legacy keyCode 229 protects IME Escape
1251 PASS composition ref protects IME Escape
1252 PASS recent compositionend grace protects IME Escape
1253 PASS compositionend grace expires at its boundary
1254 PASS stale compositionend does not block plain Escape
1255 PASS custom newline updates the composer text
1256 PASS custom newline stays after the invocation at the caret boundary
1257
1258 50 passed, 0 failed, 50 total
1259
1260 ▶ src/__tests__/composer-profile.test.ts
1261
1262 composer profile
1263 PASS auto tool approval hydrates from persisted tabs
1264 PASS auto tool approval is acknowledged by meta
1265 PASS stale tab hydration keeps locally selected plan mode
1266 PASS compat mode keeps the plan axis enabled
1267 PASS pending plan stays pending until backend acknowledges it
1268 PASS acknowledged tab hydration keeps plan visible
1269 PASS backend acknowledgement clears pending plan
1270 PASS stale meta cannot erase a pending auto approval selection
1271 PASS auto approval stays pending while meta is stale
1272 PASS acknowledged auto approval remains enabled
1273 PASS auto approval pending clears after matching meta
1274 PASS empty goal draft remains visible through stale tab hydration
1275 PASS empty goal draft syncs to controller as normal
1276 PASS empty goal draft does not enable plan compatibility mode
1277 PASS tab hydration removes profiles for closed tabs
1278 PASS blank tab payload does not demote explicit auto approval mode to ask
1279 PASS blank meta payload does not demote explicit auto approval mode to ask
1280 PASS manual plan intent restores only the tab that enabled it
1281 PASS normal tabs do not inherit another tab's plan intent
1282 PASS manual normal mode clears plan restore intent
1283 PASS closed tabs lose plan restore intent
1284 PASS open tabs keep plan restore intent
1285 PASS turn_done plan restore uses the event tab when present
1286 PASS turn_done plan restore falls back to the active tab for legacy events
1287 PASS active goals block remembered plan restoration
1288 PASS empty goals still allow remembered plan restoration
1289
1290 26 passed, 0 failed, 26 total
1291
1292 ▶ src/__tests__/composer-resized-input-css.test.ts
1293
1294 composer resized input css
1295 PASS resized textarea fills the card's input area
1296 PASS resized textarea scrolls internally
1297 PASS resized rich input fills the card's input area
1298 PASS resized rich input scrolls internally
1299 PASS invocation caret anchor keeps a compact hit target
1300 PASS invocation caret anchor can expand around WebView2-hosted text
1301 PASS invocation caret anchor does not clip WebView2-hosted text
1302
1303 7 passed, 0 failed
1304
1305 ▶ src/__tests__/composer-run-strip.test.tsx
1306
1307 composer run strip
1308 PASS idle composer renders no run strip
1309 PASS idle composer renders no stop button
1310 PASS idle composer keeps the send button
1311 PASS floating status pill is gone
1312 PASS approval menu exposes Yolo alongside Ask and Auto
1313 PASS the visible Yolo option selects Yolo approval
1314 PASS composer has no execution-setting trigger
1315 PASS composer has no execution-setting menu
1316 PASS composer chrome does not mention execution setting
1317 PASS task-intent menu does not own a work-mode section
1318 PASS task method menu exposes plan and goal
1319 PASS .composer-task-mode-trigger stays visually closed after a short hover
1320 PASS .composer-task-mode-trigger does not render a closing-only menu
1321 PASS mode chip exposes its dismiss interaction
1322 PASS hovering a mode chip does not open the add menu
1323 PASS runtime transition has no execution-setting control
1324 PASS runtime transition disables Goal mode changes
1325 PASS runtime transition disables Ask/Auto/Yolo changes
1326 PASS runtime transition disables submit
1327 PASS ordinary running state shows the run strip
1328 PASS live region announces the stable state text only
1329 PASS running card keeps its running modifier
1330 PASS active work mounts a decorative perimeter trace
1331 PASS stop button next to send cancels the turn
1332 PASS pending approval shifts the strip into waiting
1333 PASS waiting strip names the tool awaiting approval
1334 PASS waiting text is static and stays accessible
1335 PASS waiting card hands the running accent off to the prompt card
1336 PASS waiting card takes the waiting modifier
1337 PASS waiting removes the trace rather than running an invisible animation
1338 PASS approval bar stays usable while its own prompt disables the composer
1339 PASS pending ask question shows the ask waiting state
1340 PASS approval bar stays disabled for non-approval reasons
1341 PASS resolving the prompt removes the attention strip
1342 PASS the resolved prompt falls back to the ordinary work strip
1343 PASS queued guidance renders in the shelf
1344 PASS stop cancels the running turn
1345 PASS stop folds unconsumed queued guidance back into the draft
1346 PASS restored queue clears the shelf
1347 PASS ticker excludes the time spent waiting for approval (got " 0 / 00%To compact0Turn time30sturn hit-")
1348 PASS ticker does not count the ~2.4s approval wait as model time
1349 PASS decision suspension does not render a waiting strip
1350 PASS suspendedByDecision excludes wait time from model clock (got " 0 / 00%To compact0Turn time15sturn hit-")
1351 PASS suspended wait is not counted as model work
1352 PASS tab B excludes background user-wait from model clock (got " 0 / 00%To compact0Turn time5sturn hit-")
1353 PASS background suspension is not counted as model work
1354 PASS tab B does not show tab A's ~60s turn age as model time
1355 PASS streaming TPS uses provider-output time instead of full turn age
1356 PASS the streaming reading carries the estimate marker
1357 PASS streaming token total adds the current request estimate to completed usage
1358 PASS the run strip carries the live token readout
1359 PASS an emitting model contributes throughput to the strip
1360 PASS the strip marks the estimate once
1361 PASS no grouping punctuation: colour and position do the separating
1362 PASS readings read as clock, tokens, throughput (got " 1m 0s ≈18 tokens 10 t/s")
1363 PASS throughput owns the trailing segment so a narrow strip sheds it whole
1364 PASS the clock and token count sit outside the shedable segment and are never cut
1365 PASS the token readout survives the model going quiet
1366 PASS a quiet model withholds throughput instead of freezing a rate
1367 PASS a quiet model contributes no shedable segment
1368 PASS a settled turn drops the strip readings
1369 PASS approval wait retains turn tokens
1370 PASS retry retains throughput
1371 PASS completed duration uses the controller timestamp minus local wait (got " 0 / 00%To compact0Turn time19sturn tps12 t/sturn output tokens104 tokensturn hit-")
1372 PASS completion keeps final in-flight token estimates
1373 PASS later wait accounting cannot change the frozen completion duration
1374 PASS switching to a completed tab preserves its duration
1375 PASS new turn does not inherit previous turn metrics
1376 PASS separate effort selector changes reasoning effort
1377 PASS changing effort does not switch models
1378 PASS effort menu closes after selection
1379 PASS unsupported models hide effort control
1380 PASS default standard has no delivery chip
1381 PASS delivery is off by default
1382 PASS delivery toggle enables delivery verification
1383 PASS closing delivery chip restores implicit standard
1384 PASS delivery does not change Plan or Goal mode
1385 PASS resized card height combines logical height and strip reservation in CSS
1386 PASS fresh composer defaults to the selected 140px height
1387 PASS render path writes the logical height, not a compensated one
1388 PASS ordinary running state reserves the metrics strip height
1389 PASS drag start does not flash-shrink the running card
1390 PASS drag release keeps the same logical-height space as the render path
1391 PASS dragging keeps the running strip reservation
1392 PASS separator reports the logical height
1393 PASS idle card releases the strip reservation
1394 PASS idle card keeps the user's logical height
1395 PASS longer draft grows above the manual baseline
1396 PASS content-derived input height reveals the longer draft
1397 PASS draft stays scrollbar-free below the cap
1398 PASS shorter draft returns to the manual baseline
1399 PASS manual baseline remains available to short drafts
1400 PASS oversized draft stops at the viewport-aware cap
1401 PASS oversized input uses the capped content viewport
1402 PASS oversized draft scrolls only after reaching the cap
1403 PASS reset restores the 140px default after manual resizing
1404
1405 96 passed, 0 failed
1406
1407 ▶ src/__tests__/composer-session-draft.test.tsx
1408
1409 composer session draft
1410 PASS clicking empty composer space focuses the text input
1411 PASS empty composer space click places the caret on the first line
1412 PASS clicking composer space places an existing draft caret at the end
1413 PASS topic draft key stays stable when session path appears
1414 PASS session A text is visible before switching
1415 PASS session A workspace ref is visible before switching
1416 PASS session B does not inherit session A text
1417 PASS session B does not inherit session A context refs
1418 PASS session B keeps its own text draft
1419 PASS session A text is restored when switching back
1420 PASS session A context refs are restored when switching back
1421 PASS session B text is restored independently
1422 PASS session B context refs stay isolated
1423 PASS session A shows its queued guidance before switching
1424 PASS switching to idle session B does not send session A guidance
1425 PASS session B does not inherit session A guidance shelf
1426 PASS session A restores its queued guidance after switching back
1427 PASS session A completion does not duplicate the Controller-owned follow-up
1428 PASS session A clears the durable item after its backend ack
1429 PASS short text paste is handled by React state
1430 PASS short multiline paste is visible after existing text
1431 PASS Ctrl+Z handles the programmatic paste transaction
1432 PASS Ctrl+Z preserves the text typed before a short paste
1433 PASS Ctrl+Shift+Z redoes the programmatic paste transaction
1434 PASS redo restores the short paste after existing text
1435 PASS a second undo returns to the pre-paste boundary
1436 PASS ordinary typing after paste undo updates the draft
1437 PASS a new native edit invalidates the programmatic redo transaction
1438 PASS stale redo cannot resurrect an earlier paste
1439 PASS short multiline paste submits once
1440 PASS short multiline paste is preserved in display text
1441 PASS short multiline paste is preserved in submit text
1442 PASS interleaved-history test starts at the paste boundary
1443 PASS Ctrl+Z leaves a native deletion above the paste transaction to the browser
1444 PASS matching net text does not make the older paste transaction look newest
1445 PASS Ctrl+Z leaves the remaining native insertion to the browser
1446 PASS the paste transaction becomes undoable only after newer native edits are exhausted
1447 PASS ordered undo eventually restores the pre-paste text
1448 PASS ordered redo restores the custom paste before its newer native edits
1449 PASS custom redo returns to the browser redo boundary
1450 PASS newer native redo remains browser-owned after the paste redo
1451 PASS two custom pastes can surround a native edit
1452 PASS the newest custom paste undoes first
1453 PASS undoing the second paste reaches its native boundary
1454 PASS the native edit between two custom pastes remains browser-owned
1455 PASS the older custom paste follows the native undo segment
1456 PASS ordered undo reaches the start of the mixed timeline
1457 PASS ordered redo restores the first custom paste
1458 PASS redo reaches the native segment after the first paste
1459 PASS ordered redo returns the interleaved native edit to the browser
1460 PASS the second custom paste redoes after the native segment
1461 PASS mixed custom/native redo restores the final state
1462 PASS legacy Ctrl+Z YOLO binding yields to composer undo while editing
1463 PASS legacy Ctrl+Z YOLO binding still undoes the paste
1464 PASS legacy Ctrl+Z YOLO binding does not toggle YOLO while editing
1465 PASS legacy Ctrl+Shift+Z YOLO binding yields to composer redo while editing
1466 PASS legacy Ctrl+Shift+Z YOLO binding still redoes the paste
1467 PASS legacy Ctrl+Shift+Z YOLO binding does not toggle YOLO while editing
1468 PASS Ctrl+Z prepares a custom redo transaction after YOLO is rebound
1469 PASS Ctrl+Y redoes the paste when the YOLO shortcut is rebound
1470 PASS Ctrl+Y restores the programmatic paste
1471 PASS Ctrl+Y does not toggle YOLO after that action is rebound
1472 PASS default Ctrl+Y remains reserved for the YOLO shortcut
1473 PASS default Ctrl+Y still toggles YOLO exactly once
1474 PASS the YOLO shortcut does not mutate composer history
1475 PASS long paste creates a folded block
1476 PASS long paste preview opens without changing text history
1477 PASS another draft does not inherit the paste undo transaction
1478 PASS Ctrl+Z in another draft leaves its text unchanged
1479 PASS source draft restores its open long-paste preview
1480 PASS source draft keeps its own folded-paste undo transaction
1481 PASS Ctrl+Z removes the folded-paste label
1482 PASS Ctrl+Z removes the folded block state
1483 PASS Ctrl+Z also clears preview state with the folded block
1484 PASS expanding a folded paste restores its original text
1485 PASS expanded paste no longer renders a folded label
1486 PASS Ctrl+Z treats pasted-block expansion as a custom transaction
1487 PASS undoing expansion restores the folded block
1488 PASS a second Ctrl+Z undoes the original folded paste
1489 PASS undoing the original folded paste restores the empty draft
1490 PASS session B is not blocked by session A's pending attachment
1491 PASS session B can submit while session A attachment is pending
1492 PASS async attachment does not land in the switched-to session
1493 PASS async attachment returns to the source session draft
1494 PASS session B is not blocked by session A's in-flight submit
1495 PASS slow submit retains session A as its target
1496 PASS session B submit keeps its own target
1497 PASS async clipboard paste does not mutate the switched-to session
1498 PASS async clipboard paste returns to its source draft
1499 PASS async cut does not delete text from the switched-to session
1500 PASS async cut completes in its source draft
1501 PASS async prompt history does not overwrite the switched-to session
1502 PASS async prompt history result returns to its source draft
1503 PASS source session reference starts asynchronous expansion
1504 PASS session-context submit retains its source tab
1505 PASS session-context submit expands source folded paste
1506 PASS session-context submit excludes switched-to folded paste
1507 PASS Add to Chat renders a dedicated composer selection card
1508 PASS selection card previews the selected text
1509 PASS selection card remove action has an accessible name
1510 PASS adding selected text preserves the existing draft
1511 PASS adding selected text returns focus to the composer
1512 PASS another session does not inherit the selection
1513 PASS the source session restores its selection draft
1514 PASS chat, code, and terminal selections each get their own selection card
1515 PASS the code selection card shows the file basename
1516 PASS the code selection card is labeled as a code selection
1517 PASS the terminal selection card is labeled as terminal context
1518 PASS the terminal selection card previews selected output
1519 PASS display includes typed selection labels with text snippets
1520 PASS submit appends the selected text context block
1521 PASS submit marks terminal selections in the JSON context
1522 PASS submit does not duplicate selected text in display-only marker blocks
1523 PASS selected chat text appears once in provider-visible submit bytes
1524 PASS submit serializes chat, code, and terminal selections deterministically
1525 PASS a completed submit clears the selection card
1526
1527 116 passed, 0 failed, 116 total
1528
1529 ▶ src/__tests__/composer-source-operations.test.tsx
1530 composer source operations: source isolation, ABA, identity replacement, lanes, finally and disposal passed
1531
1532 ▶ src/__tests__/config-load-warnings.test.ts
1533
1534 config load warnings
1535 PASS bridge payload normalization keeps unique non-empty strings
1536 PASS warning fingerprints are stable
1537 PASS empty warning lists have no fingerprint
1538 PASS safe event revisions are preserved
1539 PASS unsafe event revisions fall back safely
1540 PASS versioned bridge event payloads are normalized
1541 PASS array event payloads accept an additive revision argument
1542 PASS runtime bridge forwards normalized non-empty warnings
1543 PASS runtime warning subscription is disposable
1544 PASS stale startup snapshots cannot clear runtime warnings
1545 PASS dismissed warnings stay hidden across repeated session builds
1546 PASS events started before a successful reload cannot revive stale warnings
1547 PASS a newer recurrence can reuse the same warning fingerprint
1548
1549 13 passed
1550
1551 ▶ src/__tests__/confirm-dialog.test.tsx
1552
1553 Reasonix confirmation dialog
1554 PASS renders an accessible modal dialog
1555 PASS renders the confirmation message
1556 PASS uses the danger button recipe for deletion
1557 PASS focuses Cancel first for destructive confirmation
1558 PASS Escape cancels and closes the dialog
1559 PASS cancellation resolves false
1560 PASS restores focus to the triggering control
1561 PASS confirm action resolves true
1562
1563 8 passed, 0 failed
1564
1565 ▶ src/__tests__/connection-model-picker.test.tsx
1566 PASS: same model in independent connections retains identity and selection
1567
1568 ▶ src/__tests__/connection-title.test.tsx
1569 PASS: explicit save, Escape cancel, no blur submission, failed save retains draft, retry closes editor
1570
1571 ▶ src/__tests__/context-budget-card.test.ts
1572
1573 context budget card
1574 PASS official source key
1575 PASS learned source key
1576 PASS unknown source key
1577 PASS clip recovery
1578 PASS none recovery is empty
1579 PASS panel budget is preferred
1580 PASS context info budget is used when panel omits it
1581 PASS shared remaining is clamped
1582 PASS unknown provider has no asserted physical remainder
1583 PASS shared clipping explains overflow risk
1584 PASS exhausted shared window explains overflow risk
1585 PASS unknown provider does not claim shared-window overflow
1586 PASS independent provider does not claim shared-window overflow
1587 13 passed
1588
1589 ▶ src/__tests__/context-maintenance-notice.test.ts
1590 context-maintenance-notice: ok
1591
1592 ▶ src/__tests__/context-menu-keyboard.test.tsx
1593 context-menu keyboard: all assertions passed
1594
1595 ▶ src/__tests__/context-panel-breakdown.test.ts
1596
1597 context panel breakdown
1598 PASS small non-zero source shares are not shown as zero
1599 PASS reasoning is split out of completion rather than double-counted
1600 PASS legend values sum to used context tokens
1601 PASS usage endpoint follows used/window percent
1602 PASS prompt tokens are not scaled down when used context includes completion tokens
1603 PASS oversized provider breakdown is normalized to used context tokens
1604 PASS oversized provider breakdown does not fill the ring
1605 PASS live turn breakdown prefers Context* over billable aggregates
1606 PASS 2×30K recovery: panel segments match latest attempt, not 60000/5
1607 PASS legacy usage without Context* falls back to billable fields
1608 PASS without live usage, panel uses backend rebind snapshot
1609 PASS unknown context window keeps usage segments empty
1610
1611 context window status
1612 PASS over-limit context preserves the raw percentage while capping the meter fill
1613 PASS just-over-limit context remains visibly over 100 percent after integer formatting
1614 PASS low usage stays healthy
1615 PASS usage near compact threshold warns early
1616 PASS compact threshold reached takes warning tone
1617 PASS near hard limit overrides compact status
1618 PASS over-limit context has a distinct status
1619
1620 context panel cost
1621 PASS panel cost keeps the panel currency instead of state default
1622 PASS a single request's cost never renders under the session-cost label
1623 PASS locally accumulated session cost still renders
1624 PASS an incomplete structured quote never renders a partial selected total
1625
1626 context panel session cache scope
1627 PASS live shared ContextInfo beats a stale all-sources panel snapshot
1628 PASS panel telemetry remains the all-sources fallback without live ContextInfo
1629 PASS executor-only wire counters only bridge the pre-refresh gap
1630 PASS no data renders as empty, not NaN
1631 PASS USD panel cost renders with dollar sign
1632 PASS unexpected currency text does not leak into money values
1633 PASS unknown ISO currency codes stay readable
1634 PASS compact multi-character currency symbols are preserved
1635 PASS ISO USD cost renders with locale-aware currency formatting
1636 PASS ISO CNY cost renders with locale-aware currency formatting
1637 PASS symbol currency remains symbol-based
1638 PASS localized money preserves dash empty state
1639
1640 context panel cache rate
1641 PASS cache hit rate preserves two decimal places
1642 PASS cache hit rate shows zero when usage data exists
1643 PASS cache hit rate stays empty before usage data exists
1644 PASS healthy cache hit rate uses positive tone
1645 PASS mid cache hit rate uses notice tone
1646 PASS low cache hit rate uses warning tone
1647 PASS missing cache data stays uncolored
1648
1649 context panel usage refresh key
1650 PASS missing usage does not request a streaming refresh
1651 PASS general token changes refresh even when cache counters stay unchanged
1652
1653 context panel source rows
1654 PASS source rows keep executor before planner
1655 PASS executor source row exposes input, output, cache hit, cache miss, and request count
1656 PASS planner source row remains visible without cache metadata
1657 PASS executor source row preserves estimated usage metadata
1658 PASS missing estimated metadata remains exact for backward compatibility
1659 PASS planner source preserves absent cache metadata as empty
1660 PASS source rows omit unused planner and subagent entries
1661
1662 context panel metric token labels
1663 PASS sub-million metric tokens keep exact comma formatting
1664 PASS sub-million exact metric title matches the display
1665 PASS large metric tokens keep exact comma formatting
1666 PASS large metric exact title matches the display
1667
1668 55 passed, 0 failed, 55 total
1669
1670 ▶ src/__tests__/context-panel-capacity.test.tsx
1671
1672 context panel capacity
1673 PASS over-limit status is explicit
1674 PASS just-over-limit percentage pin remains visibly over 100 percent
1675 PASS capacity fill is capped at the physical track width
1676 PASS capacity meter does not mix token composition into its fill
1677 PASS compression threshold marker stays at the configured ratio
1678 PASS accessible summary reports the over-limit ratio
1679
1680 6 passed, 0 failed
1681
1682 ▶ src/__tests__/context-window-ring.test.tsx
1683
1684 context window ring
1685 PASS ring exposes its percentage outside Creation layout
1686 PASS keyboard activation opens usage details
1687 PASS Escape cancels pending hover timers without reopening
1688 PASS disabled ring renders nothing
1689 PASS disabled ring does not request context panel data
1690 PASS turn cost uses the session currency before panel info is available
1691 PASS ring popover keeps a just-over-limit ratio visibly above 100 percent
1692 PASS ring popover fill is capped at the physical track width
1693 PASS ring popover does not mix token composition into its capacity fill
1694 PASS old tab request starts first
1695 PASS new tab request starts after tab switch
1696 PASS stale old-tab response cannot overwrite the new tab info
1697 PASS turn duration has its own stable label
1698 PASS session duration stays separate from turn duration
1699
1700 14 passed, 0 failed
1701
1702 ▶ src/__tests__/controller-event-recovery.test.ts
1703 controller event recovery: generation and post-hydration tab bindings fence stale runtime commits
1704
1705 ▶ src/__tests__/controller-notices-heads.test.ts
1706 PASS session-log head notices localize by code and stay visible
1707
1708 ▶ src/__tests__/controller-profile-lifecycle.test.tsx
1709 controller profile lifecycle: committed source, replacement, ordering, ABA, ready restore and disposal passed
1710
1711 ▶ src/__tests__/conversation-projection.test.ts
1712 conversation projection: shared source identity, remote telemetry isolation and local-tool layout policy passed
1713
1714 ▶ src/__tests__/conversation-width.test.ts
1715
1716 conversation width contract
1717 PASS missing values use the backward-compatible standard width
1718 PASS unknown values use the standard width
1719 PASS full is preserved
1720 PASS early-paint cache restores full width
1721 PASS standard width remains fixed at 960px
1722 PASS full width never becomes narrower than standard
1723 PASS active width is exposed on the root element
1724 PASS applied width refreshes the early-paint cache
1725 PASS nested transcript content uses an unbounded inner width
1726 PASS chat column has its own width independent of legacy preferences
1727 PASS stylesheets cannot reintroduce the narrow 90 percent override
1728 PASS authoritative desktop settings replace the early-paint cache
1729 PASS older settings payloads without the field normalize to standard
1730
1731 13 passed, 0 failed
1732
1733 ▶ src/__tests__/cost-rate-band.test.ts
1734 ▶ cost rate band aggregation
1735 ✔ keeps a uniform band and marks crossings mixed (0.357166ms)
1736 ✔ does not declare a band after an unknown or legacy quote (0.085334ms)
1737 ✔ uses a compact, unambiguous label for the mixed-rate badge (0.084875ms)
1738 ✔ cost rate band aggregation (1.035917ms)
1739 ℹ tests 3
1740 ℹ suites 1
1741 ℹ pass 3
1742 ℹ fail 0
1743 ℹ cancelled 0
1744 ℹ skipped 0
1745 ℹ todo 0
1746 ℹ duration_ms 4.423625
1747
1748 ▶ src/__tests__/crash-rejection-containment.test.ts
1749
1750 crash rejection containment
1751 PASS a bare Go error string is recoverable
1752 PASS a stackless error-like object is recoverable
1753 PASS an undefined reason is recoverable
1754 PASS an Error with a stack is a genuine crash
1755 PASS a backend rejection is marked handled
1756 PASS a backend rejection does not paint the crash overlay
1757 PASS a backend rejection dispatches the recoverable-error event with its message
1758 PASS a backend rejection records a frontend diagnostic
1759 PASS existing crash suppressions still short-circuit before containment
1760 PASS a rejection already handled by a bridge filter is left alone
1761 PASS a stacked Error rejection stays unhandled for the crash surface
1762 PASS a stacked Error rejection still paints the crash overlay
1763 PASS a stacked Error rejection is not downgraded to a toast
1764 PASS window.error still paints the crash overlay
1765
1766 14 passed, 0 failed, 14 total
1767
1768 ▶ src/__tests__/crash-reporting.test.ts
1769
1770 crash reporting
1771 PASS installs WebKit compatibility before application imports
1772 PASS Object.hasOwn polyfill accepts own properties
1773 PASS Object.hasOwn polyfill rejects inherited properties
1774 PASS VirtualMenu.tsx avoids measurement-triggered React update loops
1775 PASS WorkspacePanel.tsx avoids measurement-triggered React update loops
1776 PASS HljsDiff.tsx avoids measurement-triggered React update loops
1777 PASS LineNumberCode.tsx avoids measurement-triggered React update loops
1778 PASS normalizes string reasons
1779 PASS extracts top app frame
1780 PASS unhandled rejection is a nonfatal exception kind
1781 PASS global handler payload identifies source
1782 PASS captures error type
1783 PASS captures component stack
1784 PASS keeps human-readable message
1785 PASS reports unhandled global events by default
1786 PASS ignores global events already handled by a filter
1787 PASS ignores Chromium ResizeObserver loop limit notices
1788 PASS suppresses React's recoverable concurrent-render diagnostic
1789 PASS suppresses superseded remote status errors delivered through PromiseRejectionEvent.reason
1790 PASS reports unrelated PromiseRejectionEvent reasons
1791 PASS ignores Chromium ResizeObserver undelivered notification notices
1792 PASS identifies locationless opaque script errors
1793 PASS keeps located script errors out of opaque grouping
1794 PASS opaque grouping uses stable safe context
1795 PASS opaque grouping never includes breadcrumb messages
1796 PASS ignores ResizeObserver notices delivered through ErrorEvent.error
1797 PASS checks ErrorEvent.error when ErrorEvent.message is empty
1798 PASS checks ErrorEvent.error when ErrorEvent.message is a wrapper
1799 PASS adds script location to opaque window.error messages
1800 PASS keeps opaque script errors bare when WebView provides no location
1801 PASS report identifies incomplete process coverage
1802 PASS missing CPU is not reported as zero
1803 PASS missing profiler is explicit and does not claim to reconstruct the event
1804 PASS performance pressure reports use performance kind
1805 PASS performance pressure reports identify source
1806 PASS performance pressure reports partition by stable pressure label
1807 PASS performance pressure reports use a stable error type
1808 PASS performance fingerprint message avoids dynamic durations
1809 PASS performance fingerprint label avoids dynamic durations
1810 PASS formats long task context
1811 PASS payload message keeps lag context
1812 PASS labels long task pressure
1813 PASS labels heap pressure
1814 PASS tracks high heap pressure separately
1815 PASS tracks critical heap pressure separately
1816 PASS does not repartition non-heap performance groups
1817 PASS adds the heap tier to the report fingerprint
1818 PASS ignores startup long tasks before grace ends
1819 PASS ignores short long-task observer entries
1820 PASS records post-grace long tasks
1821 PASS ignores long tasks while the window is hidden
1822 PASS ignores long tasks immediately after visibility resumes
1823 PASS records long tasks after the visibility resume grace period
1824 PASS ignores long tasks while unfocused
1825 PASS prompts on a single 800ms+ long task
1826 PASS tolerates streaming-render bursts below the 3s cumulative budget
1827 PASS prompts past the 3s cumulative budget
1828 PASS cumulative path needs at least 3 tasks
1829 PASS ignores an isolated lag spike without long-task evidence
1830 PASS prompts on consecutive lag samples
1831 PASS prompts on a lag spike corroborated by a blocking long task
1832 PASS does not treat unrelated short long tasks as lag corroboration
1833 PASS hides the no-signal self/window attribution
1834 PASS hides unknown attribution
1835 PASS surfaces cross-context culprits with their container
1836 PASS recent long tasks carry their attribution
1837 PASS formats sampled top frames into the report context
1838 PASS omits the frames section when no profile was captured
1839 PASS ignores event-loop lag while the window is hidden
1840 PASS ignores event-loop lag immediately after visibility resumes
1841 PASS records event-loop lag after the visibility resume grace period
1842 PASS ignores event-loop lag while unfocused
1843 PASS ignores event-loop lag immediately after focus resumes
1844 PASS records event-loop lag once both resume grace windows pass
1845 PASS prompts an unhandled label past cooldown while visible
1846 PASS suppresses an already reported or dismissed label
1847 PASS respects the prompt cooldown window
1848 PASS never prompts while the window is hidden
1849 PASS never prompts while unfocused
1850 PASS first post-grace event-loop tick primes without reporting startup backlog
1851 PASS resume-boundary tick does not report suspended-timer delay as event-loop lag
1852 PASS refocus-boundary tick does not report napped-timer delay as event-loop lag
1853 PASS an isolated settled-state timer discontinuity does not prompt
1854 PASS consecutive settled-state lag still prompts
1855 PASS round-trips reported labels for the same build
1856 PASS re-surfaces reported labels on a new build
1857 PASS tolerates missing storage
1858 PASS tolerates corrupt storage
1859 PASS copy reports success through the async clipboard API
1860 PASS copy falls back to the desktop native clipboard bridge when the clipboard API rejects
1861 PASS the rejected clipboard write goes through the native bridge exactly once
1862 PASS copy falls back to execCommand when both the clipboard API and bridge are unavailable
1863 PASS the last-resort path drives the execCommand copy
1864 PASS writeClipboardText never rejects when execCommand throws
1865 PASS an execCommand that throws resolves to a failed copy
1866 PASS the hidden textarea is still cleaned up when execCommand throws
1867
1868 96 passed, 0 failed, 96 total
1869
1870 ▶ src/__tests__/decision-footer-lifecycle.test.tsx
1871 PASS Decision Footer preserves masked layout, Todo/rewind hosts, and Composer identity/draft
1872
1873 ▶ src/__tests__/decision-slots-lifecycle.test.tsx
1874 decision slots: independent Suspense preserves visible siblings and focus
1875
1876 ▶ src/__tests__/decision-surface.test.tsx
1877
1878 decision surface
1879 PASS all eight product decision surfaces have browser mocks
1880 PASS tool_approval has a distinct canonical browser mock trigger
1881 PASS plan_approval has a distinct canonical browser mock trigger
1882 PASS ask has a distinct canonical browser mock trigger
1883 PASS workspace_conflict has a distinct canonical browser mock trigger
1884 PASS mode_jobs has a distinct canonical browser mock trigger
1885 PASS close_active has a distinct canonical browser mock trigger
1886 PASS clear_context has a distinct canonical browser mock trigger
1887 PASS mcp_interaction has a distinct canonical browser mock trigger
1888 PASS Chinese mock phrases remain convenient for visual QA
1889 PASS legacy approval preview trigger remains compatible
1890 PASS long-option QA has a canonical browser trigger
1891 PASS long-option QA has a convenient Chinese trigger
1892 PASS long-option QA is not counted as a ninth product surface
1893 PASS Plan has start, revise, and exit-without-executing actions
1894 PASS Plan actions use button-group semantics
1895 PASS Plan actions are announced as buttons
1896 PASS Plan has no redundant confirm button
1897 PASS Plan card exposes a clear non-executing exit
1898 PASS Plan card relies on the global Stop control
1899 PASS expanding a Plan description never starts execution
1900 PASS Plan disclosure announces its expanded state
1901 PASS Revise opens the inline editor in one click
1902 PASS Opening revision does not start execution
1903 PASS Exit without executing runs once and ignores a double click
1904 PASS Exit without executing never approves plan execution
1905 PASS Exit without executing does not submit a plan revision
1906 PASS number key 3 exits Plan without execution
1907 PASS Plan starts with one click and ignores double submit
1908 PASS Plan start approves execution once
1909 PASS ordinary tool approval has four options
1910 PASS default selection is allow once
1911 PASS tool approval keeps the complete option description in a desktop tooltip
1912 PASS tool approval uses the shared decision scroller
1913 PASS tool approval confirm footer stays visible outside the scroller
1914 PASS Enter on tool disclosure never approves the default permission
1915 PASS Enter expands tool approval copy
1916 PASS Enter collapses tool approval copy again
1917 PASS expanding tool approval copy never submits the selected permission
1918 PASS tool approval disclosure announces its expanded state
1919 PASS clicking deny only selects
1920 PASS deny becomes selected
1921 PASS double click/enter submits only once
1922 PASS deny maps to (false,false,false)
1923 PASS Auto recovery has continue and try-another actions
1924 PASS Auto boundary actions use button-group semantics
1925 PASS Auto boundary actions are announced as buttons
1926 PASS Auto recovery does not add a third Stop decision
1927 PASS Auto boundary card relies on the global Stop control
1928 PASS Auto recovery has no select-then-confirm bar
1929 PASS Auto boundary uses plain confirmation copy
1930 PASS Auto boundary hides the internal mechanism name
1931 PASS UI hides internal checkpoint terms
1932 PASS UI hides internal reviewer terms
1933 PASS safer action is first and explicitly recommended
1934 PASS recommended recovery action has primary emphasis
1935 PASS one-shot override remains available as the secondary action
1936 PASS Auto boundary shows one concise summary by default
1937 PASS summary explains the user-visible risk
1938 PASS pending action is shown once by default
1939 PASS details stay collapsed by default
1940 PASS custom requirements stay available as a quiet progressive-disclosure link
1941 PASS guidance link uses plain user-facing copy
1942 PASS custom requirements editor stays collapsed by default
1943 PASS custom requirements do not become a third decision card
1944 PASS recovery card stays bounded by the viewport
1945 PASS recovery card clips only at its shared scroll boundary
1946 PASS recovery content uses one internal scroller
1947 PASS recovery options avoid a nested height cap
1948 PASS recovery option text remains available in the shared scroller
1949 PASS expanding recovery details never resolves the pending action
1950 PASS bounded recovery offers a current-task semantic grant
1951 PASS task grant is opt-in
1952 PASS task grant is grouped with Continue
1953 PASS task grant shows the exact host-classified scope
1954 PASS double click submits only once
1955 PASS continue resolves only the waiting action
1956 PASS older recovery events without a display scope retain the generic safety explanation
1957 PASS guidance link expands an inline text area
1958 PASS guidance input exposes the same 1000-character client limit as submission
1959 PASS placeholder demonstrates a concrete constraint
1960 PASS expanded guidance receives focus
1961 PASS empty guidance cannot submit
1962 PASS expanded guidance preserves the two primary decisions
1963 PASS Escape collapses custom guidance
1964 PASS Escape restores focus to the guidance link
1965 PASS collapsing guidance does not answer the confirmation
1966 PASS guidance hides and clears the unrelated Continue task grant
1967 PASS non-empty guidance enables submission
1968 PASS Ctrl+Enter submits custom requirements once
1969 PASS custom requirements always choose another approach
1970 PASS custom requirements are trimmed and forwarded exactly once
1971 PASS checked grant updates the action label before consent
1972 PASS checked grant no longer looks like a one-shot action
1973 PASS checked semantic grant uses the task-scoped recovery action
1974 PASS material scope change uses a neutral plan-level title
1975 PASS plan card names the user-owned decision class
1976 PASS plan card identifies removed steps
1977 PASS plan card shows the removed step
1978 PASS plan card identifies added steps
1979 PASS plan card shows the replacement step
1980 PASS plan card shows newly added scope
1981 PASS plan delta omits progress-only status noise
1982 PASS plan adoption remains explicit
1983 PASS plan rejection opens a guided revision path
1984 PASS plan adoption is not visually preselected
1985 PASS plan adjustment is not visually preselected
1986 PASS unbounded scope change does not offer a task grant
1987 PASS technical diagnostics are available on demand
1988 PASS technical details expand on request
1989 PASS expanded diagnostics use restrained detail rows
1990 PASS expanded diagnostics do not render an alert wall
1991 PASS opening plan adjustment does not reject or adopt the proposal
1992 PASS plan adjustment opens and focuses the guidance field
1993 PASS plan guidance uses an explicit submit action
1994 PASS non-empty plan guidance enables submission
1995 PASS submitted plan guidance rejects the proposed transition
1996 PASS plan adjustment forwards the user's exact guidance
1997 PASS adopting the plan approves the waiting transition once
1998 PASS fresh dynamic-tool decision only offers allow once and deny
1999 PASS fresh dynamic-tool decision hides remembered grants
2000 PASS fresh dynamic-tool decision is one-shot
2001 PASS decision row wrappers accommodate external details
2002 PASS all decision rows stay aligned at the top of the scroll region
2003 PASS shared decision rows keep a stable desktop height
2004 PASS shared decision rows retain a compact click target
2005 PASS single-line decision copy stays vertically centered with the option key
2006 PASS decision keys do not carry a top offset
2007 PASS decision labels keep a clear visual hierarchy
2008 PASS shared decision descriptions stay on one summary line
2009 PASS supplementary runtime copy uses ordinary single-line flow
2010 PASS collapsed runtime summaries stay inside their row
2011 PASS long runtime summaries end with an ellipsis
2012 PASS runtime summaries keep readable density
2013 PASS runtime description starts collapsed
2014 PASS expanding runtime details never triggers the decision action
2015 PASS runtime description expansion is announced
2016 PASS expanded details keep the runtime row vertically centered
2017 PASS expanded details do not alter the runtime row summary
2018 PASS runtime full copy opens in a separate detail region
2019 PASS runtime detail region reveals the full copy
2020 PASS dangerous runtime summary keeps the shared stable row
2021 PASS truncated dangerous runtime consequences open automatically outside the row
2022 PASS runtime decision number keys invoke their displayed actions
2023 PASS runtime decision shortcuts do not invoke disabled actions
2024 PASS runtime decision shortcuts ignore editable fields
2025 PASS Escape cancels the runtime decision
2026 PASS complete dangerous runtime summary renders one action row
2027 PASS complete dangerous runtime summary is not repeated below the row
2028 PASS complete dangerous runtime summary needs no redundant disclosure
2029 PASS clear context defaults to cancel
2030 PASS clear context combines the consequence into one header summary
2031 PASS clear context does not repeat the consequence in a second body row
2032 PASS Enter on clear-context disclosure does not trigger the safe default
2033 PASS Enter on clear-context disclosure never clears the conversation
2034 PASS Enter expands clear-context copy
2035 PASS Enter collapses clear-context copy again
2036 PASS expanding clear-context copy does not trigger the safe default
2037 PASS expanding clear-context copy does not clear anything
2038 PASS clicking clear only selects
2039 PASS clear option becomes selected
2040 PASS truncated destructive consequence opens automatically after selection
2041 PASS auto-open destructive consequence has no redundant toggle
2042 PASS confirm runs clear once
2043 PASS Escape cancels clear context immediately
2044 PASS composer decision host remains mounted
2045 PASS host is hidden during decision
2046 PASS host is inert during decision
2047 PASS draft value survives while host is hidden
2048 PASS host is aria-hidden during decision
2049 PASS deny selected on first prompt
2050 PASS new prompt id resets selection to allow once
2051 PASS selection reset does not submit
2052
2053 173 passed, 0 failed, 173 total
2054
2055 ▶ src/__tests__/delivery-continue-commands.test.tsx
2056 delivery continue commands: ready gate, goal resume chain, stale-ownership fence and empty-target gate passed
2057
2058 ▶ src/__tests__/desktop-close-behavior-hint.test.tsx
2059 desktop close behavior hint: ok
2060
2061 ▶ src/__tests__/desktop-event-recovery.test.ts
2062 desktop event recovery: coalescing, generation/session fencing, retry and disposal passed
2063
2064 ▶ src/__tests__/desktop-host-stub.test.ts
2065 desktop host stub advertises only callable commands
2066
2067 ▶ src/__tests__/desktop-navigation-lifecycle.test.tsx
2068 desktop navigation: queue ownership, ABA, IM hydrate, dirty-worktree warning, tab resume, failure and disposal passed
2069
2070 ▶ src/__tests__/desktop-preferences-lifecycle.test.tsx
2071 desktop preferences: lightweight snapshot, legacy mirror, warning revision and disposal passed
2072
2073 ▶ src/__tests__/diagnostics-settings.test.tsx
2074 diagnostics settings page
2075 diagnostics-settings: ok
2076
2077 ▶ src/__tests__/diff-rendering.test.ts
2078
2079 diff rendering contract
2080 PASS diff rows carry old/new line numbers
2081 PASS unified diff rows preserve hunk line numbers
2082 PASS archived write_file without args does not synthesize 0 lines
2083 PASS explicit empty write_file content still summarizes as 0 lines
2084 PASS diff rows share the longest scroll width
2085 PASS diff table fills the visible viewport
2086 PASS diff row background fills table width
2087 PASS diff gutter remains visible while horizontally scrolled
2088 PASS diff sticky gutter anchors at left
2089 PASS writer dispatch uses preview file diff summary instead of content line count
2090 PASS writer dispatch keeps preview file diff for rendering
2091 PASS completed writer archives with preview file diff summary
2092 PASS completed writer with preview diff is still archived
2093 PASS history writer restores preview file diff summary
2094 PASS history writer restores preview file diff body
2095 PASS completed writer keeps +N -M summary after archiving
2096 PASS completed writer data is still archived
2097 PASS summary does not require keeping tool output
2098 PASS failed writer is marked as error
2099 PASS failed writer clears cached +N -M summary
2100 PASS replace_all multi_edit defers summary until result
2101 PASS replace_all multi_edit uses applied replacement count
2102 PASS dispatch updates clear stale writer summary
2103
2104 23 passed, 0 failed, 23 total
2105
2106 ▶ src/__tests__/dock-view-requests.test.tsx
2107 PASS view-owned reveal requests, remount and project isolation
2108
2109 ▶ src/__tests__/edit-replay.test.ts
2110
2111 edit replay
2112 PASS unchanged edits preserve the original submitted text
2113 PASS edited visible text preserves submit-only prefix and raw attachment refs
2114 PASS messages without hidden submit context use the rebuilt submit text
2115 PASS editing a selected-context message preserves the quoted context suffix without submitting its display label
2116 PASS editing a structured skill message preserves its slash invocation
2117 PASS multiple abilities serialize in visual order
2118 PASS multiple abilities restore from display and submit text
2119 PASS restored ability segments preserve visible task text
2120 PASS editing a mixed ability message preserves every invocation
2121 PASS inserting after an invocation preserves the selected entity boundary
2122 PASS same-offset entities serialize around inserted text in visual order
2123 PASS spaced English messages restore every inline invocation
2124 PASS editing a structured message keeps the hidden referenced-session prefix
2125 PASS hydrated slash-form display restores its leading known invocation
2126 PASS hydrated display restores consecutive leading invocations
2127 PASS unknown leading slash names stay plain text after reload
2128 PASS mid-text slash tokens stay plain text after reload
2129
2130 17 passed, 0 failed
2131
2132 ▶ src/__tests__/effort-switcher.test.tsx
2133 PASS adapter-owned effort options and exact selection
2134
2135 ▶ src/__tests__/extension-surface.test.tsx
2136
2137 Extension surface reducer
2138 PASS accepts new/equal/newer generations
2139 PASS rejects an older generation
2140 PASS events without a generation always pass
2141 PASS extension_status upserts a status entry
2142 PASS accepted generation is recorded
2143 PASS statuses key on pluginId:surfaceId
2144 PASS same-key status replaces in place
2145 PASS extension_surface kind=status also updates the entry
2146 PASS card appends one transcript item
2147 PASS card re-publish replaces in place
2148 PASS stale card generation is dropped
2149 PASS equal generation replaces
2150 PASS different surface id appends a separate card
2151 PASS form surface arms the pending form
2152 PASS stale form generation is dropped
2153 PASS a new form replaces the pending one
2154 PASS clearExtensionForm dismisses the form
2155 PASS notifications queue for the toast drain
2156 PASS notification ids are unique
2157 PASS drain clears the notification queue
2158 PASS controller_rebuilt clears extension state and the generation fence
2159 PASS post-rebuild surfaces flow with fresh generations
2160 PASS optimistic user bubble pending
2161 PASS extension events never flush the optimistic user bubble
2162 PASS unknown surface kinds leave state untouched
2163 PASS events without an extension payload leave state untouched
2164
2165 ExtensionCard / ExtensionFormDialog components
2166 PASS card renders the title
2167 PASS card badges the plugin id
2168 PASS card renders the key-value grid
2169 PASS card renders progress as an accessible progressbar
2170 PASS card renders markdown through the shared renderer
2171 PASS action click invokes /<plugin>:<action> on the tab
2172 PASS action result message renders inline
2173 PASS successful result is not styled as an error
2174 PASS failed action still reached the bridge
2175 PASS action failure renders an inline error
2176 PASS form renders its title
2177 PASS form badges the plugin id
2178 PASS required fields keep submit disabled
2179 PASS still disabled while the required multiselect is empty
2180 PASS submit enables once required fields are filled
2181 PASS submit delivers typed values (bool / string / select default / multiselect)
2182 PASS Escape cancels the form
2183
2184 43 passed, 0 failed
2185
2186 ▶ src/__tests__/external-opener-preference-sync.test.tsx
2187
2188 external opener preference synchronization
2189 PASS the visible tab initially discovers the old preference
2190 PASS an older tab completion synchronizes the visible control
2191 PASS the visible primary action uses the synchronized preference
2192 PASS a discovery started before the write cannot restore the stale preference
2193
2194 4 passed, 0 failed, 4 total
2195
2196 ▶ src/__tests__/external-opener.test.tsx
2197
2198 external opener
2199 PASS uses the shared 28px / 7px topic-bar control geometry without an extra shadow
2200 PASS keeps both split-button segments within the shared control height
2201 PASS keeps Creation topic bars on the same 28px / 7px geometry
2202 PASS fits Workbench application artwork to the compact topic-bar control
2203 PASS preserves the slimmer Creation application artwork size
2204 PASS external opener has a distinct React key namespace
2205 PASS session actions have a distinct React key namespace
2206 PASS mounts for a Project tab
2207 PASS mounts for a Global tab without guessing from scope
2208 PASS stays hidden while an IM detail surface owns the header
2209 PASS renders a split-button menu trigger after discovery
2210 PASS renders the native application icon data URL
2211 PASS opens the installed-application menu
2212 PASS requests an installed-application refresh whenever the menu opens
2213 PASS renders applications discovered by the fresh scan
2214 PASS persists the selected application id
2215 PASS opens the exact Global workspace with the selection
2216 PASS primary action reuses the preference without another settings write
2217 PASS primary action uses the newly selected application
2218 PASS rapid primary clicks launch the workspace only once
2219 PASS opens immediately with the cached application list while refresh is still running
2220 PASS the latest overlapping discovery result wins
2221 PASS a stale discovery cannot replace the current menu
2222 PASS a newer tab selection persists even when it matches the discovered preference
2223 PASS an older tab completion cannot overwrite the latest opener preference
2224 PASS a newer failed launch does not cancel an older successful selection
2225 PASS an in-flight older preference write has the same result when a newer launch fails
2226 PASS a failed launch never persists the preference
2227 PASS a failed launch reports the launch error
2228 PASS the application launches before the preference write
2229 PASS a failed preference write reports the save error after opening
2230 PASS hides when the backend reports no local workspace capability
2231
2232 32 passed, 0 failed, 32 total
2233
2234 ▶ src/__tests__/final-readiness-locale.test.ts
2235 PASS final readiness recovery copy is aligned across locales
2236
2237 ▶ src/__tests__/font-availability.test.ts
2238
2239 font availability
2240 PASS macOS shows native UI font plus stable choices
2241 PASS Windows shows native UI font plus stable choices
2242 PASS Linux shows Noto-style UI font plus stable choices
2243 PASS detected cross-platform UI fonts are included
2244 PASS current UI font remains visible even when it is not native
2245 PASS macOS shows native mono font plus stable choices
2246 PASS Windows shows native mono font plus stable choices
2247 PASS detected mono fonts are included on Linux
2248 PASS current mono font remains visible even when it is not native
2249
2250 9 passed, 0 failed, 9 total
2251
2252 ▶ src/__tests__/footer-decision-overflow.test.ts
2253
2254 footer decision overflow
2255 PASS base .footer does not scroll/clip (composer menus can expand)
2256 PASS base .footer is not height-capped in the composer state
2257 PASS base .footer keeps its flex sizing
2258 PASS decision footer scrolls tall approval cards
2259 PASS decision footer is capped above the status bar
2260 PASS .slashmenu still anchors to the composer
2261 PASS .slashmenu still pops above the composer
2262 PASS .slashmenu uses the measured available height
2263 PASS App.tsx toggles footer--decision on the visible decision surface
2264 PASS footer--compact wiring stays intact
2265 PASS Composer measures the real menu anchor
2266 PASS Composer observes geometry while a menu is open
2267 PASS composer host stays hidden under a decision (menus cannot open)
2268 PASS no footer rule except .footer--decision clips or caps the footer
2269 PASS pasted block list is viewport-bounded
2270 PASS pasted block list scrolls internally
2271 PASS pasted blocks keep their readable height
2272 PASS attachment list is viewport-bounded
2273 PASS attachment list scrolls internally
2274
2275 19 passed, 0 failed
2276
2277 ▶ src/__tests__/frontend-diagnostics.test.ts
2278 frontend diagnostics tests passed
2279
2280 ▶ src/__tests__/github-link-rendering.test.tsx
2281
2282 github link rendering
2283 PASS recognizes GitHub issue links
2284 PASS recognizes GitHub pull request links with query parameters
2285 PASS recognizes GitHub commit links
2286 PASS leaves repository links unchanged
2287 PASS rejects insecure GitHub links
2288 PASS leaves non-GitHub links unchanged
2289 PASS does not enhance unsafe links
2290 PASS adds a GitHub icon to repository links
2291 PASS adds an external-link icon to web links
2292 PASS adds an external-link icon to HTTP links
2293 PASS adds a mail icon to email links
2294 PASS leaves relative links without an icon
2295 PASS leaves page fragments without an icon
2296 PASS does not add icons to unsafe protocols
2297 PASS keeps the original GitHub URL in selectable DOM text
2298 PASS exposes the compact visual PR label
2299 PASS gives compact PR links a contextual accessible name
2300 PASS hides the decorative GitHub icon from assistive technology
2301 PASS copies the original URL instead of the compact visual label
2302 PASS preserves an explicit Markdown link label
2303 PASS does not compact explicit Markdown link labels
2304 PASS does not override an explicit accessible link label
2305 PASS renders ordinary HTTPS destinations as rich external links
2306 PASS renders a decorative external-link icon
2307 PASS leaves relative links without rich-link styling
2308 PASS leaves relative links without an icon
2309 PASS allows rich links to wrap on narrow layouts
2310 PASS lets long unbroken link labels shrink and wrap
2311
2312 28 passed, 0 failed, 28 total
2313
2314 ▶ src/__tests__/goal-action-errors.test.tsx
2315
2316 goal action bridge errors
2317 PASS rejected Stop Goal action shows an error toast
2318 PASS rejected mode action shows an error toast
2319 PASS rejected background Goal resync shows an error toast
2320 PASS handled Goal action rejections do not emit unhandledrejection
2321 PASS mode shortcut routes through the rejection handler
2322 PASS production Composer Stop Goal adapter presents the failure exactly once
2323 PASS production Composer mode adapter presents the failure exactly once
2324
2325 7 passed, 0 failed, 7 total
2326
2327 ▶ src/__tests__/goal-activation-tab-routing.test.tsx
2328
2329 goal activation tab routing
2330 PASS harness starts on tab A
2331 PASS active tab switched to B during deferred Goal activation
2332 PASS atomic Goal submit kept source tab A
2333 PASS atomic Goal submit ran once
2334 PASS controller propagates atomic Goal bridge rejection
2335 PASS failed atomic submit still targeted source tab A
2336 PASS failed atomic Goal submit does not call split SubmitInvocationsToTab
2337
2338 7 passed, 0 failed, 7 total
2339
2340 ▶ src/__tests__/goal-runtime.test.ts
2341 goal runtime formatting: passed
2342
2343 ▶ src/__tests__/heartbeat-editor.test.tsx
2344
2345 heartbeat editor state ownership
2346 PASS trigger completion preserves the user's edited schedule
2347 PASS save carries the latest engine-owned run state
2348 PASS save carries run history added while the editor was open
2349
2350 heartbeat editor failed save
2351 PASS save stays pending until persistence resolves
2352 PASS failed save preserves the local draft
2353 PASS failed save reports an actionable error
2354 PASS failed save remains dirty and retryable
2355
2356 heartbeat editor frequency conversion
2357 PASS lossy cron conversion keeps the Custom frequency selected
2358 PASS lossy conversion keeps the original cron expression
2359 PASS lossy conversion explains why the editor did not switch
2360
2361 heartbeat recommendation draft
2362 PASS recommendation keeps its prefilled editor open
2363 PASS recommendation is not cleared by the missing-task cleanup effect
2364 PASS recommendation defaults to ask approval
2365 PASS recommendation remains a new draft with editable scope
2366 PASS recommendation stays disabled until the user explicitly enables it
2367 PASS recommendation persists the safe ask approval default
2368 PASS parent save conflict keeps the unsaved recommendation draft open
2369 PASS parent save conflict is reported instead of marking the draft clean
2370
2371 18 passed, 0 failed, 18 total
2372
2373 ▶ src/__tests__/heartbeat-locale-boundary.test.ts
2374 PASS 63 Heartbeat translations stay feature-local
2375
2376 ▶ src/__tests__/heartbeat-mutation-queue.test.ts
2377
2378 heartbeat mutation queue
2379 PASS only one full-table mutation is in flight
2380 PASS first mutation uses the loaded config token
2381 PASS second mutation starts after the first save settles
2382 PASS second mutation uses the new config token
2383 PASS second mutation rebases deletion onto the saved task list
2384 PASS rebased deletion preserves the earlier toggle
2385 PASS first caller receives its authoritative save
2386 PASS second caller receives the combined authoritative state
2387
2388 8 passed, 0 failed, 8 total
2389
2390 ▶ src/__tests__/heartbeat-next-run.test.ts
2391
2392 heartbeat next run
2393 PASS plain interval stays due after elapsed
2394 PASS time window defers elapsed interval to next opening
2395 PASS time window keeps next run inside the open window
2396 PASS cross-midnight window keeps due time in the open window
2397 PASS cross-midnight window waits for today's opening from midday
2398 PASS cycle next run ignores stale interval time windows
2399 PASS empty daily day selection does not save as every day
2400 PASS weekly default uses one weekday
2401 PASS cron weekday schedule computes next business-day run
2402 PASS cron every-15-minutes computes next slot
2403 PASS cron next run ignores lastRunAt and uses wall clock
2404
2405 engine-run merge (SivanCola review: trigger must not clobber draft)
2406 PASS trigger merge keeps draft title while adopting engine run fields
2407 PASS trigger merge adopts fresh lastRunAt without dropping draft runHistory
2408 cycle → cron conversion guards
2409 PASS biweekly refuses cron conversion
2410 PASS seconds refuse cron conversion
2411 PASS cross-midnight window refuses conversion
2412 PASS window end hour is exclusive
2413 PASS 2h window refuses conversion (frequency would grow)
2414 PASS non-top-of-hour window refuses conversion
2415 PASS non-top-of-hour window refuses m-interval conversion
2416 PASS daily with stale window keeps its own clock
2417 PASS daily converts to cron
2418 PASS weekly converts to cron
2419 PASS monthly converts to cron
2420 cycle next-run (schedule semantics, not cron)
2421 PASS daily next run is today's 22:00
2422 PASS daily next run rolls to tomorrow after 22:00
2423 PASS weekly next run is next Friday 16:00
2424 PASS monthly next run is 15th 09:00
2425 PASS monthly day-31 clamps to April 30 (mirrors backend monthlyCandidate)
2426 PASS monthly day-29 clamps to February 28 in a non-leap year
2427 PASS monthly day-29 keeps February 29 in a leap year
2428 PASS yearly next run is next Jan 1st 09:00
2429 PASS daily next run falls in the past when the task is overdue offline
2430 cron dow=7 Sunday alias
2431 PASS dow=7 (Sunday alias) computes the next Sunday run
2432 PASS dow=0,7 both spellings compute the next Sunday run
2433 biweekly parity mirrors the Go engine (Monday week anchor)
2434 PASS biweekly with Thursday anchor skips the first Monday (Monday-anchored parity)
2435 PASS biweekly with Monday anchor fires every other Monday
2436 cronToInterval refuses lossy conversions
2437 PASS weekly cron refuses interval conversion
2438 PASS fixed-time cron refuses interval conversion
2439 PASS dom-restricted cron refuses interval conversion
2440 PASS every-N-minutes cron converts
2441 PASS every-N-hours cron converts
2442 PASS top-of-every-hour is not a simple interval
2443 frontend isCronExpr field bounds (dom/month 1-based, step>0, lo<=hi)
2444 PASS dom=0 is rejected: no next run is computed for an invalid expression
2445 PASS zero step */0 is rejected (never fires)
2446 PASS descending range 5-1 is rejected (never matches)
2447 PASS dow=8 is rejected (out of range)
2448 PASS month=0 is rejected
2449 PASS valid dom expression still computes a next run
2450 cron steps use field minima and retain long-horizon matches
2451 PASS wildcard month step starts from January
2452 PASS wildcard month step skips February
2453 PASS single-value step continues from its explicit start
2454 PASS leap-day cron searches beyond one year
2455 task list computes each next run once
2456 PASS list preparation resolves each task exactly once
2457 PASS list preparation preserves next-run ordering
2458 PASS list rows reuse the precomputed next-run value
2459 frequency conversion keeps the selected editor on lossy paths
2460 PASS weekly cron cannot switch to interval
2461 PASS seconds cannot switch to cron
2462 PASS biweekly cannot switch to cron
2463 PASS cross-midnight interval cannot switch to cron
2464 biweekly parity uses civil dates across DST
2465 PASS spring-forward keeps the even-week Monday
2466 PASS fall-back keeps the even-week Monday
2467
2468 62 passed, 0 failed, 62 total
2469
2470 ▶ src/__tests__/heartbeat-test-runner-contract.test.ts
2471
2472 heartbeat test runner contract
2473 PASS focused suite has exactly one failing-exit gate
2474 PASS failing-exit gate runs after every assertion
2475 PASS final summary runs after every assertion
2476
2477 3 passed, 0 failed, 3 total
2478
2479 ▶ src/__tests__/history-catalog-body-hits.test.ts
2480 PASS history body-only hits contract
2481
2482 ▶ src/__tests__/history-load-failure-contract.test.ts
2483 PASS history load failure contract
2484
2485 ▶ src/__tests__/history-recovery-copies.test.tsx
2486
2487 history recovery data visibility
2488 PASS ordinary history keeps normal sessions
2489 PASS unique recovered content remains ordinary history
2490 PASS covered copies are hidden from ordinary history
2491 PASS ordinary history exposes no recovery-copy group
2492 PASS ordinary history exposes no copy cleanup action
2493 PASS trash collapses system recovery data by default
2494 PASS trash provides a collapsed advanced recovery-data disclosure
2495 PASS advanced disclosure keeps recovery data restorable
2496 PASS system recovery data retains its restore action
2497 PASS restore targets the selected system recovery item: expected ["/t/covered.jsonl"], got ["/t/covered.jsonl"]
2498 PASS system recovery data retains permanent delete control
2499 PASS permanent delete targets the selected system recovery item: expected ["/t/covered.jsonl"], got ["/t/covered.jsonl"]
2500 PASS ordinary trash still exposes its normal empty action
2501 PASS empty trash excludes protected system recovery data: expected [["/t/normal.jsonl"]], got [["/t/normal.jsonl"]]
2502
2503 14 passed, 0 failed
2504
2505 ▶ src/__tests__/history-tool-status.test.ts
2506
2507 history tool status
2508 PASS history users without createdAt keep no timestamp
2509 PASS history users preserve createdAt when present
2510 PASS history users preserve checkpoint turn zero
2511 PASS history users preserve non-contiguous backend checkpoint turns
2512 PASS assistant history preserves memory citations
2513 PASS assistant memory citation source is preserved
2514 PASS assistant memory citation line range is preserved
2515 PASS lowercase error result restores as error
2516 PASS lowercase error result carries error text
2517 PASS blocked result restores as error
2518 PASS missing tool result restores as stopped
2519 PASS positional tool result is consumed instead of rendering as an orphan
2520 PASS empty-id tool call restores from positional result
2521 PASS empty-id tool call keeps positional output
2522 PASS archived successful result restores as done
2523 PASS archived successful result is marked dataArchived immediately
2524 PASS archived successful result has no initial output
2525 PASS archived successful result has no initial args
2526 PASS archived successful result keeps precomputed subject
2527 PASS archived successful result keeps precomputed summary
2528 PASS archived failed result restores as error
2529 PASS archived failed result is still loadable on demand
2530 PASS archived failed result keeps bounded error preview
2531 PASS each interrupted-turn local-only record hydrates as its own tool item
2532 PASS repeated __reasonix_local_only__ toolCallIds uniquify so transcript row keys cannot collide after restart
2533
2534 25 passed, 0 failed
2535
2536 ▶ src/__tests__/hydrate-history-apply.test.ts
2537
2538 hydrate history apply
2539 PASS skipHistory blocks apply
2540 PASS missing projection blocks apply
2541 PASS idle empty surface applies history
2542 PASS running empty surface applies history
2543 PASS a mid-stream surface with no rows yet applies history
2544 PASS a running turn with no history page behind it gets one prepended
2545 PASS an already-hydrated running transcript is left alone
2546 PASS streaming assistant counts as a cached live turn
2547 PASS a live turn with no history page behind it is not cached
2548 PASS a live row the page already carries is dropped
2549 PASS a live tail the page does not carry is kept
2550 PASS foreign session items are not placeholders
2551 PASS same-session items stay placeholders
2552 PASS same path and generation prove the same session
2553 PASS different generations reject placeholders even when paths match
2554 PASS empty identities cannot prove the same session
2555 PASS backend sync preserves a proven same-session surface
2556 PASS same-session backend sync may reuse its resident history
2557 PASS backend sync replaces a generation-rebound surface
2558 PASS replace-surface hydration carries the target generation fence
2559 PASS an unbound live runtime tail can be adopted before its first metadata snapshot
2560 PASS a differently identified surface cannot be adopted as a live tail
2561 PASS a surface with persisted history is never adopted without session identity
2562 PASS a mismatched runtime epoch rejects an unbound live tail
2563 PASS retry / explicit no-cache hydrates must not serve the resident snapshot
2564 PASS preserveCachedHistory still allows a resident hit
2565 PASS unspecified preserveCachedHistory still allows a resident hit
2566 PASS reset hydrates never prefer the resident snapshot
2567 PASS idle transcript is not replaced by a shorter same-fingerprint resident snapshot
2568 PASS a newer backend page still replaces the idle transcript
2569 PASS empty idle surface still applies history
2570
2571 31 passed, 0 failed
2572
2573 ▶ src/__tests__/hydrate-replace-surface-failure.test.ts
2574
2575 replace-surface hydrate failure
2576 PASS replace-surface clears source rows before target history settles
2577 PASS target history failure exits the loading state
2578 PASS target history failure exposes a retryable error
2579 PASS target history failure never restores source rows
2580
2581 4 passed, 0 failed
2582
2583 ▶ src/__tests__/image-viewer-window-controls.test.ts
2584 image viewer and automation window controls: 8 passed
2585
2586 ▶ src/__tests__/inbox-error-localization.test.ts
2587
2588 inbox error localization
2589 PASS zh maps inbox_paused
2590 PASS zh maps inbox_capacity_items
2591 PASS zh maps inbox_capacity_bytes
2592 PASS zh maps inbox_item_too_large
2593 PASS zh maps inbox_item_not_found
2594 PASS zh maps inbox_invalid_state
2595 PASS zh maps inbox_schema_readonly
2596 PASS zh maps inbox_closed
2597 PASS zh maps inbox_empty
2598 PASS zh maps inbox_idempotency_conflict
2599 PASS zh maps channel_read_only
2600 PASS zh maps workspace_starting
2601 PASS zh maps workspace_start_failed
2602 PASS legacy backend English is localized
2603 PASS legacy startup detail is sanitized and localized
2604 PASS traditional Chinese maps stable code
2605 PASS English maps stable code
2606 PASS cancel failures localize both context and stable code
2607 PASS unknown diagnostic details stay intact
2608 PASS localized cancel context preserves unknown diagnostics
2609
2610 20 passed
2611
2612 ▶ src/__tests__/inbox-recovery-preview.test.ts
2613 inbox recovery preview: PASS
2614
2615 ▶ src/__tests__/isolated-worktree.test.ts
2616
2617 isolated worktree
2618 PASS bridge exposes non-mutating availability probe
2619 PASS bridge exposes isolated workspace creation
2620 PASS project menu probes Git before enabling isolation
2621 PASS menu disables unavailable or duplicate creation
2622 PASS project menu delegates isolated workspace creation
2623 PASS project tree identifies isolated worktrees
2624 PASS shared badge preserves the credited #6119 design contribution
2625 PASS isolated conversation fork and browser mock use the extracted two-argument binding
2626 PASS shared fork never sends an extra bridge argument
2627 PASS dirty sources are refused with actionable guidance
2628 PASS backend fallback state reaches the user
2629 PASS chat exposes only capability-gated ordinary branching
2630 PASS isolated fork keeps its menu label after extraction
2631 PASS isolated fork keeps its confirmation label after extraction
2632 PASS dirty auto-commit is opt-in by default
2633 PASS confirm re-inspects before sending one identity-bound merge request
2634 PASS state drift refreshes the panel instead of continuing
2635 PASS merge dialog exposes modal, escape, and focus-loop semantics
2636 PASS lazy merge UI keeps layout rules out of inline styles
2637 PASS merge confirmation binds the exact dirty worktree content token
2638 PASS merge modal captures its trigger before moving focus so close restores the trigger
2639 PASS worktree close is a request-object bridge call
2640 PASS cleanup is a separate request-object bridge call
2641 PASS navigation entry points await backend intent registration before switching
2642 PASS navigation registrations preserve user-intent order across deferred bridge calls and remounts
2643 PASS separate mock bindings retain isolated-worktree and activation behavior
2644 PASS lazy action entry retains exact shared-fork arguments and adoption
2645 PASS lazy action entry preserves dirty-worktree refusal without adoption
2646 isolated worktree tests passed
2647
2648 ▶ src/__tests__/katex-boxed-css.test.ts
2649 katex boxed CSS/package contract: PASS
2650
2651 ▶ src/__tests__/keyboard-shortcuts.test.ts
2652
2653 keyboard shortcuts
2654 PASS Cmd+W closes tabs on macOS
2655 PASS Cmd+Shift+W key value still matches W on macOS
2656 PASS Control+W does not close tabs on macOS
2657 PASS Meta+W does not close tabs on Windows
2658 PASS Ctrl+W closes tabs on Windows
2659 PASS Ctrl+W closes tabs on Linux
2660 PASS darwin ignores non-W keys
2661 PASS darwin requires the platform modifier
2662 PASS windows ignores non-W keys
2663 PASS windows requires the platform modifier
2664 PASS linux ignores non-W keys
2665 PASS linux requires the platform modifier
2666 PASS Cmd+K opens the palette on macOS
2667 PASS Ctrl+K opens the palette on Windows
2668 PASS ? opens shortcut help
2669 PASS Cmd+Plus still increases text size
2670 PASS formats mac settings shortcut
2671 PASS splits mac settings shortcut for display
2672 PASS formats Windows settings shortcut
2673 PASS splits Windows settings shortcut for display
2674 PASS detects shortcut conflicts
2675 PASS Cmd+L adds the selection to chat on macOS
2676 PASS Ctrl+L adds the selection to chat on Windows
2677 PASS extra modifiers do not trigger the selection shortcut
2678 PASS rebinding another action onto Ctrl+L conflicts with the selection shortcut
2679 PASS Cmd+1 maps to the first topic shortcut on macOS
2680 PASS Ctrl+1 is not a topic shortcut on macOS
2681 PASS Ctrl+9 maps to the ninth topic shortcut on Windows
2682 PASS Meta+9 is not a topic shortcut on Windows
2683 PASS topic shortcuts reject extra modifiers
2684 PASS Cmd+0 is not a topic shortcut
2685 PASS topic shortcuts yield to already-handled custom shortcuts
2686 PASS Cmd+1 still works when an input has focus
2687 PASS Ctrl+9 still works when a textarea has focus
2688 PASS topic badge uses the macOS command glyph
2689 PASS topic badge uses the Windows control modifier
2690 PASS darwin newline chord defaults to Shift+Enter
2691 PASS darwin plain Enter is not the default newline chord
2692 PASS darwin Ctrl+Enter is not the default newline chord
2693 PASS darwin send chord defaults to plain Enter
2694 PASS darwin Shift+Enter is not the default send chord
2695 PASS windows newline chord defaults to Shift+Enter
2696 PASS windows plain Enter is not the default newline chord
2697 PASS windows Ctrl+Enter is not the default newline chord
2698 PASS windows send chord defaults to plain Enter
2699 PASS windows Shift+Enter is not the default send chord
2700 PASS linux newline chord defaults to Shift+Enter
2701 PASS linux plain Enter is not the default newline chord
2702 PASS linux Ctrl+Enter is not the default newline chord
2703 PASS linux send chord defaults to plain Enter
2704 PASS linux Shift+Enter is not the default send chord
2705 PASS rebinding another action onto Shift+Enter conflicts with the newline chord
2706 PASS rebinding the newline chord onto plain Enter conflicts with the send chord
2707 PASS composer send accepts modified Enter
2708 PASS composer newline accepts modified Enter
2709 PASS composer send rejects non-Enter keys
2710 PASS unrestricted shortcuts still accept other keys
2711 PASS formats the mac newline chord
2712 PASS formats the Windows newline chord
2713 PASS Cmd+Z matches composer undo on macOS
2714 PASS Ctrl+Z matches composer undo on Windows
2715 PASS Cmd+Shift+Z matches composer redo on macOS
2716 PASS Ctrl+Shift+Z matches composer redo on Linux
2717 PASS Ctrl+Y remains a Composer-level conditional fallback
2718 PASS macOS undo is reserved while editing
2719 PASS Windows redo is reserved while editing
2720 PASS conditional Ctrl+Y redo does not reserve a global shortcut
2721 PASS composer undo is visible but locked to the native editing chord
2722 PASS composer redo is visible but locked to the native editing chord
2723 PASS custom shortcuts cannot take the Windows undo chord
2724 PASS custom shortcuts cannot take the Windows redo chord
2725
2726 71 passed, 0 failed, 71 total
2727
2728 ▶ src/__tests__/keyed-resource.test.ts
2729
2730 keyed stale-while-revalidate resource
2731 PASS same-key refresh keeps painted data
2732 PASS stale completion is ignored by sequence
2733 PASS refresh error preserves painted data
2734 PASS new key starts without unrelated data
2735 PASS 4 resource assertions passed
2736
2737 ▶ src/__tests__/language-highlighting.test.ts
2738
2739 language highlighting
2740 PASS src/App.cs has one semantic path mapping
2741 PASS src/App.cs keeps tool diffs consistent
2742 PASS src/App.cs keeps file previews consistent
2743 PASS src/App.cs resolves to a registered lexer
2744 PASS src/Component.tsx has one semantic path mapping
2745 PASS src/Component.tsx keeps tool diffs consistent
2746 PASS src/Component.tsx keeps file previews consistent
2747 PASS src/Component.tsx resolves to a registered lexer
2748 PASS src/view.xaml has one semantic path mapping
2749 PASS src/view.xaml keeps tool diffs consistent
2750 PASS src/view.xaml keeps file previews consistent
2751 PASS src/view.xaml resolves to a registered lexer
2752 PASS src/index.html has one semantic path mapping
2753 PASS src/index.html keeps tool diffs consistent
2754 PASS src/index.html keeps file previews consistent
2755 PASS src/index.html resolves to a registered lexer
2756 PASS config/app.toml has one semantic path mapping
2757 PASS config/app.toml keeps tool diffs consistent
2758 PASS config/app.toml keeps file previews consistent
2759 PASS config/app.toml resolves to a registered lexer
2760 PASS Dockerfile has one semantic path mapping
2761 PASS Dockerfile keeps tool diffs consistent
2762 PASS Dockerfile keeps file previews consistent
2763 PASS Dockerfile resolves to a registered lexer
2764 PASS containers/Dockerfile.dev has one semantic path mapping
2765 PASS containers/Dockerfile.dev keeps tool diffs consistent
2766 PASS containers/Dockerfile.dev keeps file previews consistent
2767 PASS containers/Dockerfile.dev resolves to a registered lexer
2768 PASS C:\repo\Containerfile.windows has one semantic path mapping
2769 PASS C:\repo\Containerfile.windows keeps tool diffs consistent
2770 PASS C:\repo\Containerfile.windows keeps file previews consistent
2771 PASS C:\repo\Containerfile.windows resolves to a registered lexer
2772 PASS Makefile has one semantic path mapping
2773 PASS Makefile keeps tool diffs consistent
2774 PASS Makefile keeps file previews consistent
2775 PASS Makefile resolves to a registered lexer
2776 PASS build/GNUmakefile.release has one semantic path mapping
2777 PASS build/GNUmakefile.release keeps tool diffs consistent
2778 PASS build/GNUmakefile.release keeps file previews consistent
2779 PASS build/GNUmakefile.release resolves to a registered lexer
2780 PASS CMakeLists.txt has one semantic path mapping
2781 PASS CMakeLists.txt keeps tool diffs consistent
2782 PASS CMakeLists.txt keeps file previews consistent
2783 PASS CMakeLists.txt resolves to a registered lexer
2784 PASS public/.htaccess has one semantic path mapping
2785 PASS public/.htaccess keeps tool diffs consistent
2786 PASS public/.htaccess keeps file previews consistent
2787 PASS public/.htaccess resolves to a registered lexer
2788 PASS config/httpd.conf has one semantic path mapping
2789 PASS config/httpd.conf keeps tool diffs consistent
2790 PASS config/httpd.conf keeps file previews consistent
2791 PASS config/httpd.conf resolves to a registered lexer
2792 PASS config/nginx.conf has one semantic path mapping
2793 PASS config/nginx.conf keeps tool diffs consistent
2794 PASS config/nginx.conf keeps file previews consistent
2795 PASS config/nginx.conf resolves to a registered lexer
2796 PASS build/module.makefile has one semantic path mapping
2797 PASS build/module.makefile keeps tool diffs consistent
2798 PASS build/module.makefile keeps file previews consistent
2799 PASS build/module.makefile resolves to a registered lexer
2800 PASS go mapping has a registered lexer
2801 PASS typescript mapping has a registered lexer
2802 PASS tsx mapping has a registered lexer
2803 PASS javascript mapping has a registered lexer
2804 PASS jsx mapping has a registered lexer
2805 PASS coffeescript mapping has a registered lexer
2806 PASS json mapping has a registered lexer
2807 PASS yaml mapping has a registered lexer
2808 PASS xml mapping has a registered lexer
2809 PASS xaml mapping has a registered lexer
2810 PASS html mapping has a registered lexer
2811 PASS bash mapping has a registered lexer
2812 PASS python mapping has a registered lexer
2813 PASS rust mapping has a registered lexer
2814 PASS css mapping has a registered lexer
2815 PASS scss mapping has a registered lexer
2816 PASS less mapping has a registered lexer
2817 PASS markdown mapping has a registered lexer
2818 PASS csharp mapping has a registered lexer
2819 PASS c mapping has a registered lexer
2820 PASS cpp mapping has a registered lexer
2821 PASS java mapping has a registered lexer
2822 PASS kotlin mapping has a registered lexer
2823 PASS scala mapping has a registered lexer
2824 PASS groovy mapping has a registered lexer
2825 PASS gradle mapping has a registered lexer
2826 PASS fsharp mapping has a registered lexer
2827 PASS vbnet mapping has a registered lexer
2828 PASS sql mapping has a registered lexer
2829 PASS ruby mapping has a registered lexer
2830 PASS php mapping has a registered lexer
2831 PASS lua mapping has a registered lexer
2832 PASS dart mapping has a registered lexer
2833 PASS perl mapping has a registered lexer
2834 PASS r mapping has a registered lexer
2835 PASS swift mapping has a registered lexer
2836 PASS objectivec mapping has a registered lexer
2837 PASS haskell mapping has a registered lexer
2838 PASS elixir mapping has a registered lexer
2839 PASS clojure mapping has a registered lexer
2840 PASS erlang mapping has a registered lexer
2841 PASS julia mapping has a registered lexer
2842 PASS matlab mapping has a registered lexer
2843 PASS powershell mapping has a registered lexer
2844 PASS dockerfile mapping has a registered lexer
2845 PASS nginx mapping has a registered lexer
2846 PASS properties mapping has a registered lexer
2847 PASS protobuf mapping has a registered lexer
2848 PASS graphql mapping has a registered lexer
2849 PASS toml mapping has a registered lexer
2850 PASS makefile mapping has a registered lexer
2851 PASS cmake mapping has a registered lexer
2852 PASS latex mapping has a registered lexer
2853 PASS vim mapping has a registered lexer
2854 PASS apache mapping has a registered lexer
2855 PASS Component.tsx preserves its provider-visible semantic fence tag
2856 PASS template.html preserves its provider-visible semantic fence tag
2857 PASS settings.toml preserves its provider-visible semantic fence tag
2858 PASS View.xaml preserves its provider-visible semantic fence tag
2859
2860 119 passed, 0 failed, 119 total
2861
2862 ▶ src/__tests__/launcher-card-state.test.ts
2863 truth table: spaceMode × dismissed
2864 PASS renderable m=full d=false
2865 PASS visible m=full d=false
2866 PASS renderable m=full d=true
2867 PASS visible m=full d=true
2868 PASS renderable m=hidden d=false
2869 PASS visible m=hidden d=false
2870 PASS renderable m=hidden d=true
2871 PASS visible m=hidden d=true
2872 source contracts
2873 launcher card state: 13 checks passed, 0 failed
2874
2875 ▶ src/__tests__/layout-style-defaults.test.ts
2876
2877 layout style defaults
2878 PASS wide classic default remains responsive
2879 PASS shared store starts from the classic sidebar default
2880 PASS shared store starts from the classic dock default
2881 PASS Creation applies its sidebar default after style hydration
2882 PASS Creation applies its dock default after style hydration
2883 PASS applying defaults does not overwrite user preferences
2884 PASS switching to workbench restores its responsive sidebar default
2885 PASS switching to workbench restores its dock default
2886 PASS Creation preserves a saved sidebar width
2887 PASS Creation preserves a saved dock width
2888
2889 10 passed, 0 failed, 10 total
2890
2891 ▶ src/__tests__/line-number-code.test.tsx
2892
2893 line-number code viewer
2894 PASS finds matches on consecutive lines
2895 PASS does not carry regex state between lines
2896 PASS counts occurrences rather than matching lines
2897 PASS whole-word matching respects Unicode word characters
2898 PASS treats regex metacharacters as literal search text
2899 PASS regex mode evaluates explicit patterns
2900 PASS regex mode returns JavaScript-compatible UTF-16 offsets
2901 PASS regex anchors continue to address individual source lines
2902 PASS reports unsupported multiline regex matches
2903 PASS regex mode keeps metacharacter semantics separate from literal search
2904 PASS reports invalid regular expressions
2905 PASS rejects zero-length regex matches that cannot be highlighted safely
2906 PASS keeps non-empty regex results when the expression also produces an empty match
2907 PASS caps regular-expression length
2908 PASS caps source copied into the regex worker
2909 PASS caps regex result sets before returning them to the UI
2910 PASS hard timeout terminates a stuck regex worker
2911 PASS hard timeout reports a bounded search failure
2912 PASS hard timeout covers a worker that never finishes initializing
2913 PASS cancelling a stale request terminates its worker
2914 PASS discarded requests cannot update search results
2915 PASS accepts the current worker response
2916 PASS successful searches release worker and timer resources
2917 PASS caps pathological result sets
2918 PASS reports capped result sets to the viewer
2919 PASS keeps syntax highlighting within its budget
2920 PASS falls back to plain text above the byte budget
2921 PASS falls back to plain text above the line budget
2922 PASS keeps ordinary chat code within the shared budget
2923 PASS measures the shared byte budget as UTF-8 rather than UTF-16 code units
2924 PASS applies the shared line budget without requiring a workspace preview
2925 PASS searching < preserves rendered source text
2926 PASS searching < highlights the exact entity
2927 PASS searching & preserves rendered source text
2928 PASS searching & highlights the exact entity
2929 PASS splits highlighted multiline source into rows
2930 PASS preserves lexer state on the second line
2931 PASS keeps copy controls on line-number viewers
2932 PASS opens search only for the focused viewer
2933 PASS keeps the search shortcut scoped to its owning viewer
2934 PASS does not fan the shortcut out to sibling viewers
2935 PASS removes the covered floating copy control while search is open
2936 PASS keeps copy available as a visible search-toolbar action
2937 PASS consumes a search request that arrived before the editor mounted
2938 PASS acknowledges a consumed search request
2939 PASS activates the first match after a query settles
2940 PASS reveals the first match instead of leaving the viewport behind
2941 PASS marks the first matching line as current
2942 PASS Enter advances from the visible first match
2943 PASS Enter reveals the next matching line
2944 PASS Shift+Enter navigates to the previous match
2945 PASS repeated find shortcuts stay scoped while the search input is focused
2946 PASS immediate Enter commits a pending query at its first match
2947 PASS immediate Enter reveals the first result instead of skipping ahead
2948 PASS exposes the inactive match-case state
2949 PASS exposes the active match-case state
2950 PASS keeps regex mode disabled by default
2951 PASS exposes regex mode as an explicit advanced toggle
2952 PASS shows a localized error before unsafe regex work starts
2953 PASS closes the viewer-scoped search toolbar
2954 PASS restores the floating copy control after search closes
2955 PASS uses the plain-text path above the syntax budget
2956 PASS plain-text fallback preserves escaped source text
2957 PASS plain-text fallback skips syntax token markup
2958 PASS keeps the established viewer as the default seam
2959 PASS requires an explicit line-number opt-in
2960 PASS keeps copy available on default code blocks
2961 PASS ordinary chat blocks reuse the shared syntax budget
2962 PASS oversized chat blocks skip syntax token generation
2963 PASS oversized chat blocks preserve their plain-text content
2964
2965 70 passed, 0 failed
2966
2967 ▶ src/__tests__/local-path-click-e2e.test.tsx
2968
2969 headless click-to-open e2e
2970 PASS exactly one anchor rendered
2971 PASS anchor href is the encoded file URL (file:///D:/Project/Jhtj/20250804_000000_001_%E4%B8%AD%E5%81%9C%E6%97%B6%E5%88%86%E6%9E%90/05-%E9%9D%99%E6%80%81%E9%AA%8C%E6%94%B6.md)
2972 PASS click invoked OpenLocalPath once
2973 PASS OpenLocalPath received the decoded CJK path (D:/Project/Jhtj/20250804_000000_001_中停时分析/05-静态验收.md)
2974 PASS system browser was not involved
2975 PASS UNC path forwarded as slash form (//nas/share/docs/report.md)
2976 PASS canonical UNC markdown link renders an anchor
2977 PASS canonical UNC path forwarded correctly (//nas/share/docs/report.md)
2978 PASS explicit file:/// markdown link opens locally
2979 PASS local path context menu opens on right click
2980 PASS file manager is not duplicated in the open-with list
2981 PASS context menu opens the path with the selected application
2982 PASS right-button auxclick does not open a local path
2983 PASS StrictMode opener discovery populates the local-path menu
2984 PASS latest opener discovery populates the local-path menu
2985 PASS stale opener discovery cannot replace the latest result
2986 PASS right-button auxclick does not open an http link
2987 PASS http link went to the system browser
2988 PASS OpenLocalPath was not called for the http link
2989 PASS no anchors for plain text
2990
2991 20 passed, 0 failed
2992
2993 ▶ src/__tests__/local-path-links.test.tsx
2994
2995 linkifyLocalPaths — drive paths
2996 PASS issue case: Chinese dirs and underscores survive
2997 PASS unescaped space still ends the path
2998 PASS escaped space unescapes to the real path
2999 PASS forward-slash drive path
3000 PASS trailing period stripped
3001 PASS trailing comma stripped
3002 PASS trailing closing paren stripped
3003 PASS trailing ellipsis stripped
3004 PASS CJK period stops the path
3005 PASS CJK comma stops the path
3006 PASS semicolon stops the path
3007 PASS full-width parens stop the path
3008 PASS full-width paren group after path
3009
3010 linkifyLocalPaths — file:/// and UNC
3011 PASS file URL matched whole, drive part not double-matched
3012 PASS file URL with CJK dirs
3013 PASS file URL trailing period stripped
3014 PASS authority-form UNC text becomes a local link
3015 PASS malformed file URL is not linkified
3016 PASS device-authority file URL is not linkified
3017 PASS alternate data stream file URL is not linkified
3018 PASS file URL with a query is not partially linkified
3019 PASS UNC path matched whole and \\ prefix restored
3020
3021 linkifyLocalPaths — lookalikes and non-paths
3022 PASS bare drive letter is not a path
3023 PASS clock time is not a path
3024 PASS version string is not a path
3025 PASS http URL untouched (GFM handles it)
3026 PASS custom URI containing file:// is not partially linkified
3027 PASS file:// inside another URI is not linkified
3028 PASS file:// in a URI query is not linkified
3029 PASS file:// in a URI fragment is not linkified
3030 PASS file:// after an ampersand is not linkified
3031 PASS file:// after an equals sign is not linkified
3032 PASS drive path after a letter is rejected without lookbehind
3033 PASS file URL drive segment is not double-matched
3034 PASS share-less backslash path in prose is not a UNC path
3035 PASS drive path does not also become a UNC match
3036 PASS real UNC path still matches
3037 PASS alternate data stream drive path stays inert
3038 PASS device namespace path stays inert
3039 PASS reserved DOS device path stays inert
3040 PASS numbered DOS device path stays inert
3041 PASS ordinary device-like name remains linkable
3042 PASS escaped-space path with (x86) keeps its closing paren
3043
3044 segment alternation
3045 PASS text/link/text/link/text alternation
3046 PASS leading plain text
3047 PASS first link segment
3048 PASS middle plain text
3049 PASS second link segment
3050 PASS trailing plain text
3051
3052 localPathHref round-trip
3053 PASS backslashes become forward slashes
3054 PASS CJK percent-encoded
3055 PASS hash escaped for URL safety
3056 PASS already-absolute file URL is not double-prefixed
3057 PASS literal %xx in a file URL is not double-encoded
3058 PASS authority-form UNC URL is preserved
3059 PASS slash-form UNC URL is preserved
3060 PASS decoded %20 becomes a real space
3061 PASS decodes plain path
3062 PASS preserves the leading slash for Unix paths
3063 PASS parses authority-form UNC URLs
3064 PASS normalizes four-slash UNC URLs
3065 PASS normalizes generated five-slash UNC URLs
3066 PASS rejects device-namespace authority
3067 PASS rejects slash-form device namespace
3068 PASS rejects encoded slash-form device namespace
3069 PASS rejects query-form device namespace
3070 PASS rejects encoded query-form device namespace
3071 PASS rejects alternate data stream file URL
3072 PASS rejects reserved DOS device file URL
3073 PASS rejects numbered DOS device file URL
3074 PASS keeps Unix files named like DOS devices
3075 PASS rejects file URL query strings
3076 PASS rejects file URL fragments
3077 PASS decodes percent-encoded CJK
3078 PASS malformed escapes yield null
3079 PASS uppercase file scheme is not a local URL
3080 PASS http URL is not local
3081 PASS undefined href is not local
3082
3083 remark plugin via react-markdown render
3084 PASS plain drive path renders as a file:/// anchor
3085 PASS anchor label keeps the original text
3086 PASS CJK comma boundary renders drive link
3087 PASS explicit file URL renders its own anchor
3088 PASS authority-form UNC link survives URL sanitization
3089 PASS plain text without paths renders no anchors
3090 PASS explicit link text is not re-linkified (no nested anchors)
3091 PASS uppercase FILE:/// stays inert (case-sensitive allowlist)
3092
3093 86 passed, 0 failed
3094
3095 ▶ src/__tests__/management-navigation.test.ts
3096 PASS all settings routes, remembered targets, functional updates, page retention and linked-session generations
3097
3098 ▶ src/__tests__/management-shortcuts.test.tsx
3099 PASS hidden-workspace shortcuts, command palette, child-dialog priority and return shortcut
3100
3101 ▶ src/__tests__/markdown-idle-highlight.test.tsx
3102
3103 markdown idle highlight
3104 PASS fixture exceeds the idle-highlight threshold
3105 PASS fixture stays under the highlight skip cap
3106 PASS oversized block mounts as plain text
3107 PASS plain first paint carries the COMPLETE source
3108 PASS plain first paint has no highlight markup
3109 PASS highlight is scheduled for idle time
3110 PASS idle callback swaps in highlighted HTML
3111 PASS highlighted output contains token spans
3112 PASS text content is identical before and after highlighting
3113 PASS small blocks highlight synchronously
3114 PASS small blocks render token spans immediately
3115 PASS small blocks schedule no idle work
3116 PASS over-cap blocks stay plain
3117 PASS over-cap blocks still show the complete source
3118 PASS over-cap blocks schedule no idle highlight
3119 PASS over-cap blocks remain plain after idle
3120
3121 16 passed, 0 failed, 16 total
3122
3123 ▶ src/__tests__/markdown-image-proxy.test.ts
3124
3125 markdown image proxy
3126 PASS native shell routes HTTPS images through the backend endpoint
3127 PASS native shell routes protocol-relative images through the backend endpoint
3128 PASS data images stay local
3129 PASS workspace images stay local
3130 PASS browser development keeps direct image URLs
3131 PASS the shared components map owns the image element
3132 PASS both streaming and worker paths use the async image resolver
3133
3134 7 markdown image proxy assertions passed
3135
3136 ▶ src/__tests__/markdown-natural-flow.test.tsx
3137 markdown natural flow: worker races, stable DOM/selection, final references, cache and complete blocks passed
3138
3139 ▶ src/__tests__/markdown-pipeline.test.tsx
3140
3141 markdown pipeline parity
3142 PASS code-fence fixture exceeds 100KB
3143 PASS headingsAndProse: pipeline render matches react-markdown
3144 PASS headingsAndProse: sliced blocks render identically (3 blocks)
3145 PASS gfmTable: pipeline render matches react-markdown
3146 PASS gfmTable: sliced blocks render identically (1 blocks)
3147 PASS taskList: pipeline render matches react-markdown
3148 PASS taskList: sliced blocks render identically (1 blocks)
3149 PASS strikethroughAutolink: pipeline render matches react-markdown
3150 PASS strikethroughAutolink: sliced blocks render identically (1 blocks)
3151 PASS mathInline: pipeline render matches react-markdown
3152 PASS mathInline: sliced blocks render identically (1 blocks)
3153 PASS mathBlockRepair: pipeline render matches react-markdown
3154 PASS mathBlockRepair: sliced blocks render identically (4 blocks)
3155 PASS mathInlinePipe: pipeline render matches react-markdown
3156 PASS mathInlinePipe: sliced blocks render identically (1 blocks)
3157 PASS footnotes: pipeline render matches react-markdown
3158 PASS footnotes: sliced blocks render identically (2 blocks)
3159 PASS crossBlockRefs: pipeline render matches react-markdown
3160 PASS crossBlockRefs: sliced blocks render identically (5 blocks)
3161 PASS mermaidFence: pipeline render matches react-markdown
3162 PASS mermaidFence: sliced blocks render identically (1 blocks)
3163 PASS bigCodeFence: pipeline render matches react-markdown
3164 PASS bigCodeFence: sliced blocks render identically (1 blocks)
3165 PASS cjk: pipeline render matches react-markdown
3166 PASS cjk: sliced blocks render identically (2 blocks)
3167 PASS rawHtml: pipeline render matches react-markdown
3168 PASS rawHtml: sliced blocks render identically (1 blocks)
3169 PASS unsafeAndFileLinks: pipeline render matches react-markdown
3170 PASS unsafeAndFileLinks: sliced blocks render identically (1 blocks)
3171 PASS manyBlocks: pipeline render matches react-markdown
3172 PASS manyBlocks: sliced blocks render identically (80 blocks)
3173 PASS empty fenced blocks do not render phantom code cards
3174 PASS text around empty fenced blocks remains visible
3175 PASS non-empty comment code blocks remain visible
3176 PASS non-empty comment code keeps its code-block surface
3177 PASS block keys are stable indexes
3178 PASS footnote section is the trailing block
3179 PASS footnote reference links survive slicing
3180 PASS footnote definition anchors survive slicing
3181 PASS urlTransform parity for "https://example.com/a?b=c#d"
3182 PASS urlTransform parity for "http://example.com"
3183 PASS urlTransform parity for "mailto:user@example.com"
3184 PASS urlTransform parity for "javascript:alert(1)"
3185 PASS urlTransform parity for "vbscript:x"
3186 PASS urlTransform parity for "data:text/html,boom"
3187 PASS urlTransform parity for "./relative/path"
3188 PASS urlTransform parity for "../up"
3189 PASS urlTransform parity for "/absolute"
3190 PASS urlTransform parity for "#fragment"
3191 PASS urlTransform parity for "query?only"
3192 PASS urlTransform parity for "ftp://example.com/file"
3193 PASS urlTransform parity for "file:///etc/passwd"
3194 PASS urlTransform parity for "HTTPS://EXAMPLE.COM/upper"
3195 PASS urlTransform parity for "ircs://irc.example.com/chan"
3196 PASS urlTransform parity for "xmpp:user@example.com"
3197 PASS urlTransform parity for "a:b:c"
3198 PASS urlTransform parity for ""
3199 PASS urlTransform parity for "C:\\src\\app.ts"
3200 PASS authority-form UNC survives pipeline URL sanitization
3201 PASS authority-form UNC href survives HAST rendering
3202 PASS unsafe local URL is blanked: file://./PhysicalDrive0
3203 PASS unsafe local URL is blanked: file:////?/C:/Windows
3204 PASS unsafe local URL is blanked: file:///C:/safe.txt:payload
3205 PASS unsafe local URL is blanked: file:///tmp/report.md?download=1
3206 PASS unsafe local URL is blanked: file:///tmp/report.md#section
3207 PASS content revision is deterministic
3208 PASS content revision distinguishes texts
3209 PASS hast byte estimate is positive and bounded
3210 PASS hast byte estimate grows with content
3211
3212 markdown selection projection
3213 PASS selection projection preserves readable structure, code, tables, CJK, emoji and LaTeX
3214 PASS native DOM selection includes Unicode, links and complete code text
3215 PASS selection revision fingerprints projected UTF-16 text
3216 PASS large plain table uses the virtual table representation
3217 PASS virtual table projection includes rows that never mount in the DOM
3218
3219 74 passed, 0 failed, 74 total
3220
3221 ▶ src/__tests__/markdown-worker-client.test.ts
3222
3223 markdown worker client
3224 PASS request posted to the worker
3225 PASS response resolves with the full parse result
3226 PASS pending map drains after a response
3227 PASS cancelled parse resolves undefined
3228 PASS cancelling active work terminates the stale parser
3229 PASS late response for a cancelled id is dropped
3230 PASS parse cancelled during worker startup resolves undefined
3231 PASS no pending entry survives an early cancel
3232 PASS worker parse error rejects with its message
3233 PASS pending map drains after an error
3234 PASS crashed worker rejects stranded requests
3235 PASS a fresh parse recreates the worker after a crash
3236 PASS recreated worker serves the retry
3237 PASS fallback resolves the parse result without a Worker
3238 PASS fallback receives the exact source text
3239 PASS dispose settles a pending request (1)
3240 PASS dispose settles a pending request (2)
3241 PASS dispose terminates the worker
3242 PASS dispose drains the pending map
3243 PASS parse after dispose resolves undefined immediately
3244 PASS no pending-request growth across 100 mixed cycles
3245 PASS no unhandled rejections across 100 mixed cycles
3246 PASS every cycle issued exactly one request
3247 PASS worker queue runs only one parse at a time
3248 PASS request ids increase monotonically
3249
3250 25 passed, 0 failed, 25 total
3251
3252 ▶ src/__tests__/math-golden.test.ts
3253
3254 stripMathDelimiters
3255 PASS \(...\)
3256 PASS \[...\]
3257 PASS $$...$$
3258 PASS $...$
3259 PASS no delimiters
3260 PASS inline with pipe
3261
3262 latexNormalizeForKatex
3263 PASS plain unchanged
3264 PASS escapes # in \text
3265 PASS escapes $ in \text
3266 PASS escapes & % _ ^ ~ in \text
3267 PASS no double-escape
3268 PASS non-text commands
3269 PASS | to \vert without doubled space
3270 PASS |x| keeps command boundary
3271 PASS already escaped $
3272 PASS raw % escaped to \% (KaTeX comment-char fix)
3273 PASS % at end of math escaped
3274 PASS % between letters escaped
3275 PASS already-escaped \% not double-escaped
3276 PASS \textrm also handled
3277 PASS \textbf no special chars
3278 PASS nested braces in command
3279 PASS \| is left alone (readCommand handles \|, not | branch)
3280 PASS \\| line break + pipe: both | → \vert
3281 PASS array column-spec | preserved (c|c)
3282 PASS array column-spec ||| preserved
3283 PASS array column-spec cc|c preserved
3284 PASS pipe OUTSIDE array still → \vert
3285 PASS tabular column-spec | preserved
3286 PASS ket \|uud\rangle → \vert
3287 PASS ket \|\alpha\rangle → \vert
3288 PASS ket with content → \vert
3289 PASS ket in fraction → \vert
3290 PASS two kets both → \vert
3291 PASS norm \|x\| preserved (double bar)
3292 PASS norm \|v\|^2 preserved
3293 PASS norm with content preserved
3294 PASS bra \langle\psi\| → \vert
3295 PASS inner product \| → \vert
3296 PASS \tag without aligned passes through
3297 PASS aligned without \tag unchanged
3298 PASS aligned with \tag → align
3299 PASS aligned with multiple \tag → align
3300 PASS boxed aligned with \tag → boxed align
3301 PASS gathered with \tag → gather
3302
3303 isLikelyInlineMath — math
3304 PASS $x$ (single var)
3305 PASS $E=mc^2$
3306 PASS $x_i^2$
3307 PASS $\alpha$
3308 PASS $a \le b$
3309 PASS $\frac{a}{b}$
3310 PASS $f(x)$
3311 PASS $x+1$
3312
3313 isLikelyInlineMath — classifier gaps from PR #4543
3314 PASS $\tfrac12$
3315 PASS $\sqrt2$
3316 PASS $SO(3,1)$
3317 PASS $SU(2)$
3318 PASS $GL(n)$
3319 PASS $K = -iJ$
3320 PASS $p = +\alpha$
3321 PASS $+$
3322 PASS $=$
3323
3324 isLikelyInlineMath — numeric syntax and contextual currency
3325 PASS $5 defaults to literal without math context
3326 PASS $10 defaults to literal without math context
3327 PASS $10.50 defaults to literal without math context
3328 PASS $100% defaults to math
3329 PASS costs $5$ is contextual currency
3330 PASS price is $10.50$ each is contextual currency
3331 PASS 10–$20$ MeV remains math
3332 PASS $20$ MeV uses a scientific unit as positive math context
3333 PASS $5$ cm uses an SI-prefixed unit as positive math context
3334 PASS $2$ L uses a scientific unit symbol as positive math context
3335 PASS $3$ dB uses a common scientific unit as positive math context
3336 PASS x = $2$ uses an operator as positive math context
3337 PASS URL
3338 PASS prose text
3339 PASS prose $x y z$ (spaces)
3340 PASS $PATH$ env token
3341 PASS $TODO$ word token
3342 PASS $OK$ word token
3343 PASS $v1$ version token
3344 PASS $foo$ plain word
3345
3346 isLikelyInlineMath — single-letter regression
3347 PASS lowercase $x$ → math
3348 PASS uppercase $I$ → math (math name in non-English prose)
3349 PASS uppercase $A$ → math
3350 PASS uppercase $V$ → math
3351
3352 isLikelyInlineMath — primed letters and bracketed labels
3353 PASS $S'$ → math (primed letter)
3354 PASS $y''$ → math (double prime)
3355 PASS $f'(x)$ → math (primed function)
3356 PASS $\psi'$ → math (Greek with prime)
3357 PASS $[56]$ → math (irrep label)
3358 PASS $[56,0^+]$ → math
3359 PASS $[\mathbf{56}]$ → math
3360
3361 isLikelyInlineMath — minimal LaTeX patterns (regression)
3362 PASS single-digit $1$, $2$, $5$ → literal without context
3363 PASS multi-digit $42$ → literal without context
3364 PASS $2.5x$ is math (number with variable)
3365 PASS $10%$ is math (percentage with LaTeX)
3366 PASS $2.5x dollars$ → NOT math (prefix-only numeric variable)
3367 PASS $10\% off$ → NOT math (prefix-only escaped percentage)
3368 PASS $5\cdot3$ is math (number with LaTeX command)
3369 PASS comma-separated $A, B$ → math (ordered pair)
3370 PASS comma-separated $1, 2, 3$ → math (sequence)
3371 PASS comma-separated $\alpha, \beta$ → math (Greek pair)
3372 PASS parens-wrapped $(A, B)$ inner → math
3373 PASS cycle notation $(12)$ → math
3374 PASS cycle notation $(12)(34)$ → math
3375 PASS $S$ (set name) → math
3376 PASS $S$ with surrounding prose (regression)
3377 PASS one-sided comparison $< B$ → math
3378 PASS one-sided comparison $<= 0$ → math
3379 PASS one-sided comparison $> 5$ → math
3380 PASS one-sided comparison $A <$ → math
3381 PASS one-sided equality $=1$ → math
3382 PASS one-sided signed equality $=-1$ → math
3383 PASS one-sided equality is fully anchored
3384 PASS $< B$ with surrounding prose
3385
3386 KaTeX renderToString — end to end
3387 PASS chiral decomposition renders
3388 PASS \|x\| renders as double bars
3389
3390 normalizeMath — LLM delimiter conversion
3391 PASS \(…\) → $…$
3392 PASS \[…\] → $$…$$
3393 PASS \\[ line-break spacing protected
3394
3395 normalizeMath — \slashed conversion (regression)
3396 PASS \slashed{p} deferred to AST policy
3397 PASS \slashed{\partial} deferred to AST policy
3398 PASS \slashed in prose deferred to AST policy
3399 PASS unbraced \slashed normalisation deferred to AST policy
3400 PASS unbraced \slashed letter normalisation deferred to AST policy
3401
3402 normalizeMath — inline $$ glued to prose (regression)
3403 PASS inline $$ after prose
3404 PASS inline $$ after closing bracket
3405 PASS inline $$ after closing brace (\end{...}$$)
3406 PASS inline $$ after comma on same line as content
3407 PASS well-formed $$ already on own line is normalised consistently
3408 PASS \[…\] → $$…$$ still works (no spurious blank line)
3409 PASS digit before $$ is NOT a prose boundary (preserves c^2$$)
3410 PASS orphan opening $$ is not duplicated
3411 PASS multiple display blocks on one line are all normalised
3412
3413 normalizeMath — semantic dollar decisions deferred to AST policy
3414 PASS $1$ preserved for contextual classification
3415 PASS $PATH$ preserved for AST literal restoration
3416 PASS $x^2+y^2$ is math
3417 PASS $\alpha+\beta$ is math
3418 PASS $10.50$ preserved for contextual classification
3419 PASS $I$ is math (uppercase single letter)
3420 PASS multiple prose dollars preserved for parser-aware policy
3421
3422 normalizeMath — Markdown code regions stay literal
3423 PASS inline code with env token
3424 PASS multiple inline code spans
3425 PASS fenced code with env token
3426 PASS fenced code protected while prose math renders
3427 PASS escaped $ in inline code stays literal
3428 PASS regex patterns with $ in code blocks stay literal
3429 PASS template literals with $ in inline code stay literal
3430
3431 normalizeMath — text-mode escapes (regression)
3432 PASS $\text{cost is $5}$ inner $ is parser-safe and reversible
3433 PASS $\text{baryon #}$ # escape is deferred to AST policy
3434 PASS $\text{a & b}$ & escape is deferred to AST policy
3435 PASS $\text{cost is \$5}$ escaped dollar stays literal
3436 PASS $\textrm{cost is \$5}$ escaped dollar stays literal
3437 PASS $\sqrt{x}$ non-text command preserved
3438
3439 normalizeMath — TEXT_MODE_PAIR trailing content
3440 PASS $\text{cost is $5} + x^2$ inner $ escaped with trailing
3441 PASS $\text{a} | b$ pipe after text command
3442 PASS $\text{abc}$ simple text-mode (no trailing)
3443
3444 normalizeMath — pipe handling
3445 PASS $|x+1|$ absolute value
3446 PASS $\|x\|$ norm preserved (no \vert mangling)
3447
3448 normalizeMath — % in math
3449 PASS trailing % escape deferred to AST policy
3450 PASS pure percentage preserved for AST math policy
3451 PASS already-escaped \% left alone
3452
3453 normalizeMath → KaTeX end-to-end
3454 PASS text mode with literal $: $\text{cost is $5}$
3455 PASS text mode with #: $\text{baryon #}$
3456 PASS text mode with &: $\text{a & b}$
3457 PASS norm: $\|x\|$
3458 PASS abs value: $|x+1|$
3459 PASS simple equation: $x=1$
3460 PASS fraction: $\frac{a}{b}$
3461 PASS greek letters: $\alpha + \beta$
3462 PASS sqrt with surrounding spaces: $ \sqrt{x} $
3463 PASS display equation: $$E=mc^2$$
3464 PASS LLM-native inline delimiter: \(\alpha\)
3465 PASS LLM-native display delimiter: \[\sum_{i=1}^n i\]
3466 PASS display with absolute values: $$ |a| = |b| $$
3467 PASS boxed aligned (no \tag): $$\boxed{\begin{aligned}
3468 r_A E_\pi(k;0) &= B(k^2) \\
3469 F_R(k;0) + 2r_A F_\pi(k;0) &= A(k^2)
3470 \end{aligned}}$$
3471 PASS boxed aligned with \tag → align (no error): $$\boxed{\begin{aligned}
3472 r_A E_\pi(k;0) &= B(k^2) \tag{10}\\
3473 F_R(k;0) + 2r_A F_\pi(k;0) &= A(k^2) \tag{11}
3474 \end{aligned}}$$
3475 PASS LLM-native boxed aligned: \[\boxed{\begin{aligned}
3476 x &= 1 \\
3477 y &= 2
3478 \end{aligned}}\]
3479 PASS array with c|c column spec: $$\begin{array}{c|c} a & b \\ c & d \end{array}$$
3480 PASS array with cc|c column spec: $$\begin{array}{cc|c} a & b & c \\ d & e & f \end{array}$$
3481 PASS array with |c|c| column spec: $$\begin{array}{|c|c|} a & b \\ c & d \end{array}$$
3482 PASS ket with \| → single bar (regression): $\|\psi\rangle$
3483 PASS ket in fraction with \|: $\frac{1}{\sqrt{2}}\|uud\rangle$
3484 PASS norm \|x\| → double bar (regression): $\|x\|$
3485 PASS bra closer \| → single bar (regression): $\langle\psi\|$
3486 PASS primed letter S': $S'$
3487 PASS primed function call: $f'(x)$
3488 PASS bracketed irrep label: $[56]$
3489 PASS bracketed irrep label with charge: $[56,0^+]$
3490
3491 normalizeMath — non-math inputs pass through
3492 PASS multi-digit currency preserved for AST policy: costs $100$ today
3493 PASS LaTeX line-break spacing: line break \\[4pt] here
3494 PASS plain text: hello world
3495
3496 normalizeMath → remark-math render boundary
3497 PASS currency '$5 and $6' renders as literal dollars, not math
3498 PASS paired currency 'costs $1$ today' drops the spurious closing delimiter
3499 PASS paired decimal currency uses surrounding price context
3500 PASS Chinese paired currency uses localized price context
3501 PASS full-width punctuation keeps paired currency literal
3502 PASS parentheses do not hide preceding currency context
3503 PASS braces do not hide preceding currency context
3504 PASS curly quotes do not hide preceding currency context
3505 PASS full-width parentheses do not hide Chinese currency context
3506 PASS parenthesized suffix currency unit repairs paired dollars
3507 PASS dash-separated cash suffix repairs paired dollars
3508 PASS cash context keeps paired currency literal
3509 PASS bold markup does not hide preceding currency context
3510 PASS emphasis does not hide surrounding currency context
3511 PASS ambiguous paired numbers remain literal without positive math context
3512 PASS env var $PATH$ renders as literal, not math
3513 PASS range endpoint 10–$20$ MeV renders numeric math
3514 PASS standalone $42$ remains literal without positive math context
3515 PASS scientific unit makes a paired number mathematical
3516 PASS centimetres make a paired number mathematical
3517 PASS litres make a paired number mathematical
3518 PASS decibels make a paired number mathematical
3519 PASS parenthesized scientific quantity remains mathematical
3520 PASS parenthesized ambiguous value retains mathematical wrapper context
3521 PASS one-sided equality $=1$ renders as math
3522 PASS one-sided equality does not prefix-match prose
3523 PASS inline code remains outside math policy
3524 PASS AST policy applies KaTeX percent normalisation
3525 PASS AST policy applies unbraced slashed normalisation
3526 PASS AST policy preserves braced slashed source after rendering
3527 PASS parser-safe text-mode math restores the exact copy source
3528 PASS real inline math $x^2$ still renders as KaTeX
3529 PASS inline math with asymmetric delimiter padding still renders
3530 PASS inline math with multiple delimiter spaces still renders
3531 PASS GFM table preserves inline absolute-value math and every cell
3532 PASS display math preserves original TeX in the KaTeX root and annotation
3533 PASS inline Young diagrams preserve their authored macro source
3534 PASS display Young tableaux preserve their authored macro source
3535 PASS Young source survives nested pipe protection without cross-assignment
3536 PASS multiple formulas restore their own source without cross-assignment
3537 PASS blockquote display math does not swallow following inline math
3538 PASS multi-line blockquote display math strips quote markers from the formula
3539
3540 normalizeMath — Young diagram macros
3541 PASS \yng(2,1) renders as (2,1) Young diagram
3542 PASS \yng(2,1) in prose (no $ delimiters) gets wrapped and rendered
3543 PASS \yng inside \(...\) does not get double-wrapped
3544 PASS \yng inside \[...\] stays display math without triple dollars
3545 PASS escaped dollar before bare \yng does not suppress wrapping
3546 PASS digit-starting inline math with \yng does not get nested wrappers
3547 PASS digit-starting inline math with \young does not get nested wrappers
3548 PASS display math ending in digit closes before following bare \yng
3549 PASS bare \yng after inline math is separated from adjacent dollars
3550 PASS bare \yng before inline math is separated from adjacent dollars
3551 PASS \yng (2,1) with a space before parens gets wrapped and rendered
3552 PASS \yng(3,2,1) renders as (3,2,1) Young diagram
3553 PASS \yng(2,1){a&b\\c\\d&e} renders filled Young tableau
3554 PASS \young(2 1) compatibility shorthand renders as (2,1) diagram
3555 PASS \young(ab,c) labelled youngtab syntax renders labels
3556 PASS \young(ab,c) labelled cells keep boxes
3557 PASS \young(abcd,:cd,:c) skew placeholders are invisible offsets
3558 PASS \yng(4,3,2,1) renders as (4,3,2,1) Young diagram
3559 PASS \yng(3,2,1) uses left-aligned array (rows start at same x)
3560 PASS expandYoungDiagrams uses flush cells (\! cancels \,)
3561 PASS expandYoungDiagrams uses flush rows (\[-0.525em] closes the math-axis gap)
3562 PASS expandYoungDiagrams substitutes correct array form
3563 PASS expandYoungDiagrams handles \yng with content
3564 PASS expandYoungDiagrams handles labelled \young rows
3565 PASS expandYoungDiagrams treats comma-separated numeric \young as labels, not a 12-cell row
3566 PASS expandYoungDiagrams leaves invalid negative \yng shape alone
3567 PASS expandYoungDiagrams leaves oversized \yng shape alone
3568 PASS expandYoungDiagrams leaves non-Young macros alone
3569
3570 263 passed, 0 failed, 263 total
3571
3572 ▶ src/__tests__/mcp-app-protocol.test.ts
3573 PASS complete tool arguments are parsed
3574 PASS invalid arguments degrade to an empty object
3575 PASS non-object arguments are refused
3576 PASS raw MCP result content is preserved
3577 PASS raw structuredContent wins over duplicate presentation data
3578 PASS standard result fields are preserved
3579 PASS text fallback becomes a CallToolResult content block
3580 PASS bounded structured fallback is delivered
3581 PASS App-initiated call preserves isError
3582 PASS App-initiated call preserves structuredContent
3583 PASS App-initiated call preserves embedded resource metadata
3584 PASS App-initiated call preserves result metadata
3585 PASS invalid App-initiated CallToolResult is rejected
3586 PASS https link origin is normalized
3587 PASS http loopback-style origin is allowed
3588 PASS unsafe link is refused: javascript:alert(1)
3589 PASS unsafe link is refused: file:///tmp/secret
3590 PASS unsafe link is refused: https://user:pass@example.test/private
3591 PASS unsafe link is refused: //example.test/no-scheme
3592 PASS AppBridge sends complete input before the tool result
3593 PASS AppBridge teardown is attempted before unmount cleanup
3594 PASS privileged App callbacks use tab-bound host APIs
3595
3596 22 passed, 0 failed
3597
3598 ▶ src/__tests__/mcp-interaction.test.tsx
3599 PASS App decision surface recomputes when an MCP interaction arrives
3600 PASS old and new flat schema properties become fields
3601 PASS string field carries required + bounds
3602 PASS integer field carries default + max
3603 PASS boolean field detected
3604 PASS legacy enumNames labels stay compatible
3605 PASS 2025-11-25 titled single-select is normalized
3606 PASS 2025-11-25 titled multi-select carries defaults
3607 PASS string formats reach the renderer
3608 PASS nested schemas fail closed instead of becoming text
3609 PASS null schema yields no fields
3610 PASS schema without properties yields no fields
3611 PASS boolean default stays explicit
3612 PASS missing required reported by label
3613 PASS valid values coerce without errors
3614 PASS scalar values coerce to JSON types
3615 PASS multi-select answers remain string arrays
3616 PASS bounds, fractional integers, and selection limits are rejected
3617 PASS mcp_interaction event sets state
3618 PASS mcp_interaction waits for the user
3619 PASS prompt_answered clears the card
3620 PASS browser mock routes the MCP interaction to its origin tab
3621 PASS browser mock identifies the requesting MCP server
3622 PASS browser mock exposes old and new structured controls
3623 PASS browser mock acknowledges the MCP answer on the origin tab
3624 PASS browser mock completes the preview turn after an answer
3625 PASS browser mock can be triggered repeatedly
3626 PASS repeated browser mocks use distinct prompt ids
3627 PASS card shows server and field label
3628 PASS server message describes the dialog without crowding its title
3629 PASS form field rendered as input
3630 PASS required field prefilled from schema default
3631 PASS new form focuses its first field
3632 PASS immediate MCP actions are not exposed as listbox options
3633 PASS MCP actions expose button-group semantics
3634 PASS submit action rendered
3635 PASS submit sends accept with the typed form values
3636 PASS unknown nested schema cannot be submitted as lossy text
3637 PASS unsupported form keeps a clear safe exit and explanation
3638 PASS invalid form does not answer the blocked MCP request
3639 PASS required field exposes native and ARIA validation state
3640 PASS field error is associated with its control
3641 PASS failed submit returns focus to the first invalid field
3642 PASS url card shows the exact server and target host
3643 PASS url card hides query params from the summary line
3644 PASS url mode keeps cancel distinct from decline
3645 PASS open link passes the exact URL once
3646 PASS accept without form content
3647
3648 48 passed, 0 failed
3649
3650 ▶ src/__tests__/mcp-oauth-eligibility.test.ts
3651
3652 ▶ src/__tests__/memory-citation-visibility.test.ts
3653
3654 memory citation visibility
3655 PASS compiler-only citations stay out of the transcript
3656 PASS regular memory citations remain visible
3657 PASS mixed citations keep only user-facing memory references
3658 PASS mixed citations preserve the regular memory citation
3659 PASS non-Memory-v5 compiler kind is not hidden by kind alone
3660
3661 5 passed, 0 failed
3662
3663 ▶ src/__tests__/memory-compiler-display.test.ts
3664
3665 memory compiler display strip
3666 PASS leaves plain user text untouched
3667 PASS removes a complete contract block
3668 PASS removes a complete block after user text
3669 PASS cuts a dangling/truncated block instead of leaking raw JSON
3670
3671 4 passed, 0 failed
3672
3673 ▶ src/__tests__/mermaid-rendering.test.tsx
3674 PASS matrix failures are contained during pan/zoom layout sync
3675 PASS matrix failures are contained during toolbar actions
3676 PASS zero-sized layouts are deferred before SVG matrix work
3677 PASS inline pan/zoom wraps the drawing in one viewport group
3678 PASS SVG definitions stay outside the transformed viewport
3679 PASS the viewport does not transform SVG definitions
3680 PASS definition children remain available by ID
3681 PASS fit keeps the browser meet mapping at unit scale
3682 PASS wheel zooms in around the cursor
3683 PASS wheel zoom-out clamps at the minimum zoom
3684 PASS reset restores the fitted unit transform
3685 PASS wheel zoom-in clamps at the maximum zoom
3686 PASS pointer drag pans the drawing in screen pixels
3687 PASS destroy detaches the interaction listeners
3688 PASS MermaidDiagram no longer imports svg-pan-zoom
3689 PASS styles no longer carry svg-pan-zoom hooks
3690
3691 mermaid rendering
3692 PASS streaming markdown commits on an animation frame
3693 PASS streaming markdown applies an adaptive parse budget
3694 PASS streaming markdown exposes an immediate lightweight tail
3695 PASS large Markdown finalization waits for browser idle time
3696 PASS large Markdown finalization emits a performance measure
3697 PASS large Markdown retains completed top-level sections
3698 PASS stable Markdown sections share one semantic container
3699 PASS Markdown blocks skip offscreen layout while preserving learned intrinsic sizes
3700 PASS Markdown exposes an explicit streaming state
3701 PASS assistant messages pass streaming state to Markdown
3702 PASS the shared components map lazy-loads the Mermaid renderer
3703 PASS the shared components map routes mermaid fenced code blocks to the Mermaid renderer
3704 PASS large headed Markdown is divided into bounded stable chunks
3705 PASS stable Markdown chunking preserves every source byte
3706 PASS appending a section leaves all completed chunks unchanged
3707 PASS fenced Markdown chunking preserves source bytes
3708 PASS headings inside fenced code never become section boundaries
3709 PASS cross-section references use one semantic Markdown renderer
3710 PASS list containers stay in one semantic Markdown renderer
3711 PASS stable Markdown optimization preserves nested list and fence DOM semantics
3712 PASS short streaming Markdown uses the 50ms parse budget
3713 PASS medium streaming Markdown uses the 150ms parse budget
3714 PASS long streaming Markdown uses the 300ms parse budget
3715 PASS commit target stops at the last completed block
3716 PASS no completed block means nothing to parse yet
3717 PASS trailing boundary commits everything
3718 PASS an open fence stays in the tail for code-styled streaming
3719 PASS open display math keeps the whole text parsed
3720 PASS a closed fence promotes immediately without waiting for a blank line
3721 PASS closed display math promotes immediately
3722 PASS a partial heading line completes the paragraph before it
3723 PASS a terminated heading promotes itself as a complete block
3724 PASS a later list marker commits prior tight list items, including indented URL continuations
3725 PASS an in-progress list marker still commits the previous completed item
3726 PASS a single list item stays in the tail until the next item or a blank line
3727 PASS ordered list markers complete prior items the same way
3728 PASS task-list markers complete prior items the same way
3729 PASS a list marker completes the paragraph before it without taking the new item
3730 PASS a nested list marker completes the parent item and leaves the child in the tail
3731 PASS a setext underline is not treated as a list marker
3732 PASS emphasis without a marker space is not a list item
3733 PASS list markers inside an open fence do not create commit boundaries
3734 PASS a blank line after a list still commits the whole list
3735 PASS the search-list source still renders as a list in the final Markdown tree
3736 PASS streaming Markdown starts from the current text
3737 PASS an in-progress block never schedules a parse commit
3738 PASS the growing block rides the tail, not the parsed prefix
3739 PASS a completed block commits up to its boundary
3740 PASS tail growth alone schedules no further parse
3741 PASS a rolling Markdown window drops its stale parsed prefix before paint
3742 PASS short stream finalization still commits immediately
3743 PASS a single tight list item stays off the parsed prefix
3744 PASS a later list item commits the previous tight item into the parsed prefix
3745 PASS large Markdown keeps its committed content while finalization waits for idle
3746 PASS large Markdown schedules one idle finalization callback
3747 PASS idle finalization commits the complete large Markdown text
3748 PASS sanitizer strips event attributes from the root SVG
3749 PASS sanitizer removes script nodes
3750 PASS sanitizer keeps safe external links
3751 PASS sanitizer removes javascript links
3752 PASS sanitizer removes data xlink links
3753 PASS sanitizer routes Mermaid image resources through the backend proxy
3754 PASS sanitizer removes external SVG use resources
3755 PASS sanitizer strips event attributes from child nodes
3756 PASS https Mermaid links are safe
3757 PASS mailto Mermaid links are safe
3758 PASS file Mermaid links are not safe
3759 PASS fragment Mermaid links are not opened externally
3760 PASS Mermaid renderer shows its toolbar
3761 PASS Mermaid renderer calls the render adapter once
3762 PASS Mermaid renderer passes the diagram definition to Mermaid
3763 PASS safe SVG link remains in the rendered DOM
3764 PASS unsafe SVG link href is stripped in the rendered DOM
3765 PASS rendered SVG root event handler is stripped
3766 PASS rendered SVG script nodes are removed
3767 PASS zoom in button calls the pan zoom instance
3768 PASS zoom out button calls the pan zoom instance
3769 PASS reset zoom button calls the pan zoom instance
3770 PASS SVG links open through the external browser bridge
3771 PASS unsafe SVG links do not open externally
3772 PASS source tab shows the Mermaid definition
3773 PASS fullscreen diagram portals into the chat pane
3774 PASS Escape closes the Mermaid fullscreen portal
3775 PASS a plain tail has no code fence split
3776 PASS a closed fence leaves no open code tail
3777 PASS an open fence at the tail start has no plain head
3778 PASS the open fence split keeps the info-string language
3779 PASS the open fence split drops the opener line from the code body
3780 PASS text before the open fence stays plain
3781
3782 105 passed, 0 failed, 105 total
3783
3784 ▶ src/__tests__/message-pasted-blocks.test.ts
3785
3786 message pasted blocks
3787 PASS Simplified Chinese pasted text labels are parsed from submit text
3788 PASS Traditional Chinese pasted text labels are parsed from submit text
3789 PASS English pasted text labels are parsed from submit text
3790 PASS unknown labels are ignored
3791 PASS selection labels sanitize closing brackets in file names
3792 PASS terminal selections use a Terminal label prefix
3793 PASS selection cards recover duplicate snippets, bracketed file names, and terminal source from JSON context
3794 PASS label-shaped authored prose is not consumed as a selection card
3795 PASS unterminated label-shaped prose cannot consume the exact trailing selection labels
3796 PASS selection labels no longer use pasted-text marker parsing
3797
3798 10 passed, 0 failed
3799
3800 ▶ src/__tests__/message-reasoning-panel.test.tsx
3801 thought presentation: latest/first line, duration, manual disclosure and legacy preference independence passed
3802
3803 ▶ src/__tests__/mock-global-workspace.test.ts
3804 mock global workspace: initial, opened and blank tabs preserve the native directory identity
3805
3806 ▶ src/__tests__/mock-remote-catalog.test.ts
3807 mock remote catalog: open, refresh, model, new session, selection and close agree
3808
3809 ▶ src/__tests__/model-settings-receipt.test.ts
3810 PASS: receipt readback, no write replay, saved application failure and unknown outcome
3811
3812 ▶ src/__tests__/model-switcher-refresh.test.tsx
3813 model switcher refresh: PASS
3814
3815 ▶ src/__tests__/native-motion.test.tsx
3816
3817 native motion fallbacks
3818 PASS tail append preserves transcript entrance reset key
3819 PASS history prepend changes transcript entrance reset key
3820 PASS tab switch changes transcript entrance reset key
3821 PASS reveal signal changes transcript entrance reset key
3822 PASS collapse passes a CSS easing to Element.animate
3823 PASS collapse waits for native completion
3824 PASS finish and late cancel settle collapse only once
3825 PASS finished open state uses auto height
3826 PASS rejected collapse animation runs its completion fallback
3827 PASS rejected collapse animation exposes content
3828 PASS direction reversal cancels the previous animation
3829 PASS superseded open callback is suppressed
3830 PASS unexpected cancellation settles the active direction
3831 PASS cancelled close reaches zero height
3832 PASS stable entrance reset key animates an appended row
3833 PASS entrance animation uses the shared CSS easing
3834 PASS finished entrance exposes the row
3835 PASS changed reset key pre-seeds restored rows without animation
3836 PASS append after a reset animates normally
3837 PASS deferred virtual history does not animate with a new append
3838 PASS only the genuinely appended virtual row animates
3839 PASS a rejected entrance does not prevent later entries from attempting motion
3840 PASS rejected entrance exposes the first row
3841 PASS rejected entrance exposes later rows
3842 PASS transition content mounts while open
3843 PASS transition content remains mounted during close delay
3844 PASS transition content unmounts without transitionend
3845
3846 27 passed, 0 failed, 27 total
3847
3848 ▶ src/__tests__/navigation-surface-lifecycle.test.tsx
3849 PASS navigation receipts are unique, source-bound, and consumed exactly once
3850
3851 ▶ src/__tests__/navigation-surface-transition.test.ts
3852
3853 navigation surface transition
3854 PASS A completion cannot release C's mask
3855 PASS coalesced B completion cannot release C's mask
3856 PASS the latest completion releases its own mask
3857 PASS a stale request cannot replace the retained source
3858 PASS the latest request mounts its target under the mask
3859 PASS a stale paint terminal cannot release the latest mask
3860 PASS the matching paint terminal releases the mask
3861 PASS paint acknowledgement matches the complete ticket
3862 PASS an old paint token cannot commit B
3863 PASS A → B → A cannot revive A's old paint token
3864 PASS same-tab replacement session rejects the old ticket
3865 PASS one paint frame cannot expose the target
3866 PASS a changed viewport geometry restarts the stability gate
3867 PASS two stable geometry frames commit the target
3868 PASS stalled placement receives two bounded recovery opportunities
3869 PASS the second failed placement terminates without permanent loading
3870 PASS the current backend navigation result is accepted
3871 PASS the current backend navigation result does not reassert
3872 PASS a stale backend-activating result starts visible-tab reassertion
3873 PASS a stale backend-activating result is rejected after reassertion
3874 PASS stale reassertion receives the mutating target identity
3875 PASS navigation masking commits synchronously before the bridge await
3876 PASS the last stable transcript is retained during navigation
3877 PASS the visible transcript is decoupled from the hydrating target
3878 PASS navigation renders a blocking transcript overlay
3879 PASS the navigation overlay is opaque while target rows settle
3880 PASS App removes source live output during navigation
3881 PASS navigation no longer collapses the composer footprint
3882 PASS masked target footer cannot paint or receive input
3883 PASS target-masked paint uses the target footer geometry
3884 PASS both Reveal paths guard stale backend activation results
3885 PASS surface settlement is diagnosed only from target paint readiness
3886 PASS source workspace data may finish after a newer navigation
3887 PASS stale workspace completion cannot mutate current UI
3888 PASS old workspace finally addresses only its own surface intent
3889
3890 35 passed, 0 failed
3891
3892 ▶ src/__tests__/new-session-load-race.test.tsx
3893
3894 new session load race
3895 PASS reset clears real transcript items
3896 PASS reset preserves hydration placeholder separately
3897 PASS empty history keeps the real transcript empty
3898 PASS empty history marks transcript hydration loaded
3899 PASS empty history clears hydration placeholder items
3900 PASS hydrate_done clears the history-loaded marker
3901 PASS pre-reset metadata exposes the current session todo
3902 PASS tab-scoped NewSession is called once
3903 PASS new session clears the visible transcript
3904 PASS new session refresh replaces the previous session todo with an authoritative empty list
3905 PASS metadata started before a session transition cannot restore the previous todo
3906 PASS stale history load cannot repopulate a new blank session
3907 PASS Resume releases navigation acquisition before target history settles
3908 PASS Resume accepts the new-epoch ask and rejects the interleaved old-epoch ask before returning
3909 PASS Resume surfaceReady resolves after authoritative history and reconciliation
3910 PASS resuming a session refreshes its authoritative canonical todo state
3911 PASS Resume RPC ask emitted before return is restored after reset/history hydration
3912 PASS Resume completion performs a tab-scoped pending-prompt replay
3913 PASS channel-open accepts the new-epoch ask and rejects the interleaved old-epoch ask before returning
3914 PASS channel-open ask emitted before return is restored after reset/history hydration
3915 PASS channel-open completion performs a tab-scoped pending-prompt replay
3916 PASS reusing a blank tab forces a fresh history request
3917 PASS fresh blank-tab hydration has no old tool card
3918 PASS late old-session history cannot restore an orphaned tool card
3919 PASS queued tab click becomes visible before the older blank completion
3920 PASS queued tab click becomes backend-active before the older blank completion
3921 PASS late blank completion cannot replace the newer visible tab
3922 PASS stale blank completion does not hydrate the abandoned tab
3923 PASS late blank completion reasserts the newer backend-active tab
3924 PASS stale blank completion repairs backend focus exactly once
3925 PASS EnsureBlankSurface is called once
3926 PASS EnsureBlankSurface keeps the requested project root
3927 PASS blank surface becomes active before startup sync resolves
3928 PASS blank surface exposes the new project root
3929 PASS guarded startup sync cannot restore an older active tab
3930 PASS guarded startup sync cannot restore the old project root
3931 PASS startup accepts one user after its snapshot
3932 PASS startup accepts the ordered live suffix
3933 PASS modern new session installs its empty cut
3934 PASS new accepts one user after its snapshot
3935 PASS new accepts the ordered live suffix
3936 PASS modern clear installs its empty cut
3937 PASS clear accepts one user after its snapshot
3938 PASS clear accepts the ordered live suffix
3939 PASS modern resume records snapshot installation
3940 PASS modern resume receives backend load evidence
3941 PASS modern resume measures snapshot time separately
3942 PASS resume accepts one user after its snapshot
3943 PASS resume accepts the ordered live suffix
3944 PASS modern channel records snapshot installation
3945 PASS channel accepts one user after its snapshot
3946 PASS channel accepts the ordered live suffix
3947 PASS resume and channel use adoption without a legacy history payload
3948 PASS each modern entry point obtains one authoritative cut
3949 PASS modern entry points never read legacy history
3950 PASS pending switch does not reuse previous evidence
3951 PASS stale modern adoption cannot overwrite committed diagnostics
3952 PASS modern race retains authoritative snapshot evidence
3953 PASS switch commits the restored transcript before ancillary work finishes
3954 PASS composer stays disabled until the switched runtime is reconciled
3955 PASS composer re-enables once the switched runtime is reconciled
3956 PASS a switch issues exactly one resume page request
3957 PASS a switch does not refetch the full history page from the frontend
3958 PASS switch reports no duplicate durable load
3959 PASS the switch's first screen is attributed to the resume page
3960 PASS a superseded switch cannot paint over the newer transcript
3961 PASS superseded response cannot overwrite current switch diagnostics
3962 PASS switch initially closes admission
3963 PASS old metadata must not reopen admission during navigation registration
3964 PASS pending switch must not send into its source controller
3965
3966 70 passed, 0 failed, 70 total
3967
3968 ▶ src/__tests__/notification-volume-slider.test.tsx
3969
3970 notification volume slider
3971 PASS slider exposes its localized purpose
3972 PASS slider exposes the full 0–100% keyboard range
3973 PASS slider announces the default percentage
3974 PASS visible percentage is associated with the slider
3975 PASS dragging or using the keyboard emits the next percentage
3976
3977 5 passed, 0 failed
3978
3979 ▶ src/__tests__/onboarding-commands.test.tsx
3980 onboarding commands: model access, completion, dismissal and disposal passed
3981
3982 ▶ src/__tests__/open-topic-coalescing.test.tsx
3983
3984 open topic coalescing
3985 PASS only the running request starts while newer requests coalesce
3986 PASS superseded pending requests resolve immediately
3987 PASS latest pending request waits until it runs
3988 PASS after the running request finishes, only the latest pending request runs
3989 PASS stale running request does not update UI
3990 PASS latest coalesced request updates UI
3991 PASS only the latest successful request refreshes metadata
3992 PASS latest pending request starts after an older failing request
3993 PASS stale failure does not show a toast
3994 PASS stale failure promise does not reject
3995 PASS latest failure shows a toast
3996 PASS latest failure promise does not reject
3997 PASS latest failure refreshes metadata once
3998 PASS tab switches serialize: only the running + latest run, middle coalesces
3999 PASS no two tab switches run concurrently (no backend SetActiveTab race)
4000
4001 15 passed, 0 failed, 15 total
4002
4003 ▶ src/__tests__/pending-plan-revision-lifecycle.test.tsx
4004 pending plan revision lifecycle: source queues, request identity, replacement, ABA and disposal passed
4005
4006 ▶ src/__tests__/pending-prompt-stale-status.test.tsx
4007
4008 pending prompt vs stale runtime snapshots
4009 PASS approval event arms the prompt
4010 PASS approval event records its arrival time
4011 PASS idle snapshot fetched before the prompt event is ignored
4012 PASS stale idle snapshot keeps the approval visible
4013 PASS stale idle snapshot keeps the prompt gate
4014 PASS stale idle snapshot keeps the tab blocked on the user
4015 PASS snapshot tied with the prompt arrival counts as stale
4016 PASS stale running snapshot cannot drop the prompt gate either
4017 PASS idle snapshot fetched after the prompt event still reconciles a dead prompt
4018 PASS fresh idle snapshot ends the turn
4019 PASS snapshot without freshness metadata keeps the legacy clearing behavior
4020 PASS stale idle snapshot keeps the ask card visible
4021 PASS fresh idle snapshot still reconciles a dead ask
4022 PASS same-id replay keeps the original arrival time
4023 PASS same-id replay keeps the anchor id
4024 PASS answering records the resolved prompt id
4025 PASS a same-id replay of an answered prompt is ignored, not re-armed
4026 PASS an ignored replay leaves running/turnActive exactly as the answer left them
4027 PASS an ignored replay leaves the original anchor untouched
4028 PASS turn_done cannot resurrect a replay that was never re-armed
4029 PASS a replay landing after an already-applied idle snapshot is still ignored
4030 PASS turn_done stays clear after the idle-then-replay ordering
4031 PASS a replay during a genuinely busy, non-pending turn is still ignored
4032 PASS answering records the resolved id before the rebuild
4033 PASS a controller rebuild drops the resolved-id bookkeeping
4034 PASS a controller rebuild drops the prompt arrival anchor id
4035 PASS a controller rebuild drops the prompt arrival anchor time
4036 PASS a genuinely new prompt reusing an old id after rebuild is armed, not swallowed
4037 PASS the rebuilt controller's new prompt blocks the tab as expected
4038 PASS the optimistic answer records a tombstone before the backend call resolves
4039 PASS a failed submit undoes the tombstone for that id
4040 PASS a replay after a failed submit can recover the still-pending prompt
4041 PASS answering the second prompt records its own tombstone
4042 PASS a stale failure for an older id does not clobber the current tombstone
4043 PASS a drain report not covering the visible approval leaves the state untouched
4044 PASS the still-pending plan approval card survives the yolo switch
4045 PASS no tombstone is written for a prompt the backend still holds
4046 PASS a later replay of the still-pending prompt re-arms it
4047 PASS an empty drain report is a no-op
4048 PASS a drained approval is dismissed
4049 PASS a drained approval is tombstoned like an answered one
4050 PASS a delayed re-delivery of the drained prompt stays suppressed
4051 PASS a controller rebuild advances the prompt epoch
4052 PASS the new controller's answer records its own tombstone
4053 PASS a failure from a pre-rebuild epoch cannot erase the new controller's tombstone
4054 PASS the answered prompt's delayed replay stays suppressed after the stale failure
4055 PASS a same-epoch failure still undoes the tombstone
4056 PASS a session reset advances the prompt epoch too
4057 PASS a pre-rebuild drain result cannot dismiss the new controller's same-id approval
4058 PASS a stale drain result cannot tombstone the new controller's prompt id
4059 PASS a same-epoch drain still dismisses the backend-drained approval
4060 PASS a same-epoch drain still tombstones the drained approval
4061 PASS a new prompt id re-anchors the arrival time
4062 PASS a stale snapshot predating the new prompt is still rejected
4063 PASS activation drops the prompt anchor
4064 PASS activation drops the prompt arrival time
4065 PASS confirmed background ask survives activation start
4066 PASS confirmed background ask keeps the prompt gate
4067 PASS confirmed background ask keeps the turn running
4068 PASS confirmed background ask keeps its freshness anchor
4069 PASS a new user message drops the prompt anchor id
4070 PASS a new user message drops the prompt arrival time
4071 PASS explicit answer clears the prompt
4072 PASS without a live prompt, even old snapshots reconcile normally
4073 PASS predates: snapshot older than the prompt
4074 PASS predates: snapshot newer than the prompt
4075 PASS predates: unknown snapshot freshness is not stale
4076 PASS predates: no live prompt means nothing to protect
4077 PASS predates: missing state is not stale
4078 PASS every dispatchRuntimeStatusForTab call passes its snapshot fetch time
4079 PASS a Remote event is fenced while the Local epoch is still authoritative
4080 PASS the projected Remote epoch admits tagged Host events
4081 PASS the Remote epoch regression fixture resets cleanly
4082 PASS replayed plan approval renders while a snapshot fetch is in flight
4083 PASS a snapshot fetched before the prompt event cannot clear the approval
4084 PASS the prompt gate survives the stale reconciliation
4085 PASS the tab stays blocked on the user after the stale reconciliation
4086 PASS a snapshot fetched after the prompt event still reconciles a dead prompt
4087 PASS fresh idle snapshot releases the blocked state
4088 PASS zombie approval is armed after the snapshot fetch started
4089 PASS the stale idle snapshot is rejected, the prompt survives for now
4090 PASS the scheduled fresh reconcile clears the zombie the stale rejection preserved
4091 PASS the fresh reconcile unlocks the input after clearing the zombie
4092 PASS a late SetModeForTab drain cannot dismiss a new same-id prompt
4093 PASS a late SetToolApprovalModeForTab drain cannot dismiss a new same-id prompt
4094 PASS one composer-profile sync uses one atomic backend call
4095 PASS a late atomic profile drain cannot dismiss a new same-id prompt
4096 PASS a rebuild notice without a new runtime identity does not replay the same profile
4097 PASS same profile applies once per actual runtime generation
4098 PASS concurrent identical profile replays share one backend call
4099 PASS different composer profiles are serialized per tab
4100 PASS latest composer profile starts after the older transaction
4101 PASS failed composer profile transaction blocks the caller
4102 PASS failed composer profile transaction remains retryable
4103 PASS failed profile key is not cached as applied
4104
4105 95 passed, 0 failed, 95 total
4106
4107 ▶ src/__tests__/performance-profiler-lifecycle.test.ts
4108 profiler lifecycle tests passed
4109
4110 ▶ src/__tests__/performance-report-cancellation.test.ts
4111 performance report cancellation identity tests passed
4112
4113 ▶ src/__tests__/performance-report-enrichment.test.ts
4114 performance report enrichment tests passed
4115
4116 ▶ src/__tests__/pinned-files.test.tsx
4117 PASS PinnedFilesShelf renders null when empty
4118 PASS PinnedFilesShelf renders container when files are present
4119 PASS PinnedFilesShelf renders correct number of chips
4120 PASS First chip renders filename
4121 PASS Clicking unpin button calls app.UnpinFileForTab with correct path
4122 PASS Clicking chip opens file via app.OpenWorkspacePathForTab
4123 PASS Pinned file chip exposes the backend read error
4124 PASS Pinned file chip renders a warning icon
4125 PASS WorkspaceTreeMenu shows Pin to Session Context for unpinned file
4126 PASS Clicking Pin calls app.PinFileForTab with target path
4127 PASS Pinning error displays error toast
4128 PASS Toast includes error message
4129 PASS WorkspaceTreeMenu shows Unpin from Context for already pinned file
4130
4131 ▶ src/__tests__/plugin-settings-actions.test.tsx
4132 plugin settings actions passed
4133
4134 ▶ src/__tests__/process-diagnostics.test.ts
4135 process diagnostics fallback tests passed
4136
4137 ▶ src/__tests__/project-topic-lifecycle.test.tsx
4138 project/topic commands: stable entry, targeted rename, independent lanes, ABA, cancel and disposal passed
4139
4140 ▶ src/__tests__/project-tree-archive-race.test.ts
4141 project tree archive race: 9 passed
4142
4143 ▶ src/__tests__/project-tree-catalog-completeness.test.ts
4144
4145 project tree catalog completeness
4146 PASS an incomplete catalog page preserves complete timestamps and order while appending discoveries
4147 PASS an incomplete catalog page keeps resident row identity instead of poisoning runtime metadata
4148 PASS a complete catalog page can still apply a legitimate activity decrease and canonical order
4149
4150 3 passed, 0 failed
4151
4152 ▶ src/__tests__/project-tree-diagnostics.test.ts
4153 project tree diagnostics tests passed
4154
4155 ▶ src/__tests__/project-tree-organization-races.test.tsx
4156
4157 project tree organization races
4158 PASS StrictMode effect replay does not discard the deferred group load
4159 PASS a stale initial read cannot overwrite an optimistic mutation
4160 PASS CAS conflict rebases and displays the local mutation without losing the remote group
4161 PASS metadata revision invalidates loaded groups after archive cleanup
4162
4163 project-tree-organization-races: 4 passed, 0 failed
4164
4165 ▶ src/__tests__/project-tree-organization.test.ts
4166 PASS project tree organization
4167
4168 ▶ src/__tests__/project-tree-pinned-header.test.ts
4169 PASS project tree pinned heading contract
4170
4171 ▶ src/__tests__/project-tree-pinned-shell-runtime.test.ts
4172
4173 ▶ src/__tests__/project-tree-recovery-privacy.test.ts
4174 PASS project tree keeps physical recovery copies private
4175
4176 ▶ src/__tests__/project-tree-rename-optimistic.test.ts
4177
4178 project tree optimistic rename
4179 PASS a committed rename repaints the topic row label before the catalog event arrives
4180 PASS an unchanged rename label leaves the tree identity stable
4181 PASS a rename for a topic outside the loaded tree changes nothing
4182 PASS commitRenameTopic paints the new label optimistically before the refresh round-trip
4183 PASS an expanded folder with a loading first topic page renders skeleton rows
4184 PASS a stale project-tree revision falls back to a full snapshot refetch instead of dropping the event
4185
4186 6 passed, 0 failed
4187
4188 ▶ src/__tests__/project-tree-row-stability.test.ts
4189 PASS project tree row stability contract
4190
4191 ▶ src/__tests__/project-tree-runtime-projection.test.ts
4192 PASS project tree runtime projection
4193
4194 ▶ src/__tests__/project-tree-runtime.test.ts
4195
4196 project tree runtime sessions
4197 PASS runtime bridge normalizes a legacy/null topic array
4198 PASS archive pending state is keyed by topic
4199 PASS another topic remains independently actionable
4200 PASS settling one archive leaves the other pending
4201 PASS same pending state preserves Set identity
4202 PASS without an active tab, no folders default to expanded
4203 PASS active session path expands only ancestor folders
4204 PASS activeSessionAncestorKeys matches defaultExpandedProjectTreeKeys for active session
4205 PASS active topic without runtime session rows expands only parent folders
4206 PASS waiting confirmation key stays available for side-bar pill and badge
4207 PASS runtime session row opens the concrete session path
4208 PASS regular project topic still opens by topic
4209 PASS topic with no turns and no timestamps renders previous-time fallback meta
4210 PASS unknown legacy turn counts are never presented as zero turns
4211 PASS topic with a real recent timestamp still renders just-now meta
4212 PASS completed inactive topic with newer activity shows unread attention
4213 PASS completed topic stops showing unread attention once opened at its latest activity
4214 PASS active topic does not show unread attention
4215 PASS running topic keeps runtime status instead of completed-unread attention
4216 PASS unread key stays on the logical topic when the representative path changes
4217 PASS marking a topic read survives a later representative-path refresh
4218 PASS activity at or before the first-seen baseline is not unread
4219 PASS activity newer than the first-seen baseline is unread
4220 PASS logical topic stays active when the representative path is not the open file
4221 PASS thinking topic blocks archive
4222 PASS streaming topic blocks archive
4223 PASS waiting_confirmation topic blocks archive
4224 PASS background_job topic blocks archive
4225 PASS paused topic remains archivable despite the legacy running flag
4226 PASS error topic remains archivable despite the legacy running flag
4227 PASS awaiting_delivery topic remains archivable despite the legacy running flag
4228 PASS delivery-check pause uses its own sidebar label, not paused
4229 PASS recovery pause keeps the paused sidebar label
4230 PASS legacy running topic without a detailed status blocks archive
4231 PASS idle topic remains archivable
4232 PASS topic blocks archive when any runtime child has active work
4233 PASS read workbench topic renders row actions
4234 PASS unread workbench topic reserves the action column for unread attention
4235 PASS creation topic keeps row actions disabled
4236 PASS runtime session rows do not render topic actions
4237 PASS second click on the same renameable topic suppresses open for inline rename
4238 PASS runtime session double-click still allows the session row to open
4239 PASS quickly clicking a different topic still opens the new target
4240 PASS empty project folders are not exposed as expandable disclosure rows
4241 PASS collapsed project folders keep disclosure semantics when children exist
4242 PASS expanded project folders can show the open-folder state only when children exist
4243
4244 project tree sorting
4245 PASS project arrange sorts topics by last activity while keeping project order
4246 PASS created sort mode orders topics by creation time
4247 PASS topic sorting keeps pinned topics above unpinned ones
4248 PASS creation pinned section collects topics across projects by activity
4249 PASS creation pinned topics appear once while pinned projects stay inline in project order
4250 PASS unpinning returns a topic to its original project
4251 PASS workbench pinned section still extracts pinned projects
4252
4253 project tree topic labels
4254 PASS row title drops the exact date the meta line already ends with
4255 PASS recent sessions keep the exact date next to the relative meta line
4256 PASS workbench context menu keeps the pin entry
4257 PASS creation context menu hides pin so the shared ordering stays untouched
4258 PASS empty project shells stay expandable so their first page can load
4259 PASS expanded empty project shells report the open state before their first page arrives
4260 PASS project tree ignores stale snapshots and pages while accepting the current revision
4261 PASS a newer revision in one project does not discard another project's slower page
4262 PASS empty-tree shell snapshots apply even after a faster catalog revision event
4263 PASS overlapping keyset pages replace duplicates without changing stable order
4264 PASS archiving a topic removes it from loaded children before the catalog reloads
4265 PASS a mutation refresh keeps sibling conversations visible until the replacement page arrives
4266 PASS TrashTopic removes the archived row before the shell refresh
4267 PASS archive refresh reloads only the affected topic folder after preserving the painted siblings
4268 PASS pinned conversations do not repeat as runtime session rows in their source folder
4269 PASS a pinned topic does not hide the same topic ID from another project
4270 PASS a bounded first page keeps pinned shells that fall beyond the page limit
4271 PASS a cold collapsed tree paints pinned topic shells before any folder page loads
4272 PASS shell refresh removes stale pins and adds newly pinned collapsed topics
4273 PASS shell refresh preserves loaded folders while reconciling pinned topic shells
4274 PASS topic page requests carry the selected conversation sort mode
4275 PASS changing the conversation sort mode invalidates old pages and reloads immediately
4276 PASS a delayed old-sort response cannot apply after sort invalidation
4277 PASS the first request for the new sort remains current
4278 PASS sort invalidation clears pagination cursors before the new first page loads
4279 PASS revision events refresh only affected expanded roots, with an empty roots list as broadcast
4280 PASS shell signature tracks project arrivals only, so topic page loads cannot re-arm the reload effect
4281
4282 80 passed, 0 failed
4283
4284 ▶ src/__tests__/project-tree-shell-race.test.ts
4285 PASS project tree shell race contract
4286
4287 ▶ src/__tests__/project-tree-sort-runtime.test.ts
4288
4289 ▶ src/__tests__/prompt-expiry.test.ts
4290 PASS stale Ask expiry removes only its matching card
4291 PASS stale Ask expiry preserves a newer MCP card
4292 prompt expiry: 2 passed, 0 failed
4293
4294 ▶ src/__tests__/protocol-recovery-search.test.tsx
4295 protocol recovery and search presentation passed
4296
4297 ▶ src/__tests__/provider-access-card.test.tsx
4298
4299 provider access card
4300 PASS mixed supported and unsupported profiles hide the grouped server web-search switch
4301 PASS mixed-profile cards keep the complete model summary visible
4302 PASS multi-profile cards expose one model refresh action per profile
4303 PASS profile refresh targets the selected provider instead of the first profile
4304 PASS grouped provider removal requires inline confirmation
4305 PASS card-level removal submits every grouped provider in one action
4306 PASS configured custom providers keep the removal menu available
4307 PASS configured custom provider can be confirmed for deletion
4308 PASS configured custom provider removal submits the selected provider
4309 PASS current default custom provider keeps the removal menu available
4310 PASS current default custom provider can be confirmed for deletion
4311 PASS current default custom provider removal reaches the settings backend
4312 PASS all supported grouped profiles expose server web search
4313 PASS grouped switch is off until every profile has web search enabled
4314 PASS grouped switch is on when every supported profile has web search enabled
4315 PASS installed brands allow independent new connections
4316 PASS new connection has its own credential field
4317 PASS DeepSeek and all OpenCode products render as two brands
4318 PASS OpenCode has one selectable brand entry
4319 PASS protocols never appear as top-level brands
4320 PASS Go and Zen remain distinct access plans within OpenCode
4321 PASS selecting Zen changes the credential reference
4322 PASS Zen selects its supported API format
4323 PASS installed OpenCode Go routes render as one product connection
4324 PASS OpenCode Go connection has a stable product-level identity
4325 PASS installed OpenCode Go keeps protocol routes collapsed by default
4326 PASS installed OpenCode Go exposes route controls only through an advanced disclosure
4327 PASS OpenCode Go group removal submits every installed route atomically
4328
4329 28 passed, 0 failed, 28 total
4330
4331 ▶ src/__tests__/provider-catalog.test.tsx
4332 PASS provider catalog: grouping, constrained selection, exact install, refresh state, local setup
4333
4334 ▶ src/__tests__/provider-connections.test.tsx
4335 PASS: navigation preserves drafts, add flow preserves drafts, deletion selects remaining connection
4336
4337 ▶ src/__tests__/provider-display-name.test.tsx
4338 PASS: editable connection label saves independently of stable identity and drives list title
4339
4340 ▶ src/__tests__/provider-editor-compact.test.tsx
4341 PASS: unified add/edit, isolated cancel, duplicate validation, complete model overrides and failed/successful save
4342
4343 ▶ src/__tests__/provider-editor-model-picker.test.tsx
4344
4345 provider editor model picker
4346 PASS model picker can render after async model fetch returns candidates
4347 PASS model picker shows fetched custom provider models
4348 PASS known text-only models omit redundant capability badges
4349 PASS text-only model card does not render a second image checkbox
4350 PASS pinned DeepSeek vision SKU does not show the text-only image label
4351 PASS pinned DeepSeek vision SKU does not render a configurable image checkbox
4352 PASS model capabilities remain read-only rather than introducing image-input checkboxes
4353 PASS configurable DeepSeek models do not use the read-only image-unsupported label
4354 PASS DeepSeek Responses exposes server-side web search
4355 PASS DeepSeek Anthropic exposes server-side web search
4356 PASS DeepSeek Chat Completions exposes independent web search
4357 PASS versioned official Chat Completions supports independent search
4358 PASS custom Chat Completions is not assumed to support search
4359 PASS DeepSeek-like subdomains do not inherit official defaults
4360 PASS Responses rejects the Anthropic base path
4361 PASS Anthropic requires its documented base path
4362 PASS insecure DeepSeek URLs do not inherit official defaults
4363 PASS backend verification can enable server-side web search for future curated endpoints
4364 PASS backend capability overrides endpoint inference when explicitly unsupported
4365 PASS older backend payloads retain the exact DeepSeek endpoint fallback
4366 PASS older backend payloads do not infer support for arbitrary compatible endpoints
4367 PASS backend vision capability overrides frontend endpoint inference
4368 PASS official DeepSeek Settings uses the same image-input checkboxes as other providers
4369 PASS regional DeepSeek Settings also expose per-model image-input checkboxes
4370 PASS the DeepSeek apex does not inherit official vision restrictions
4371 PASS lookalike domains with a DeepSeek prefix do not inherit official vision restrictions
4372 PASS lookalike domains with an official-host prefix remain configurable
4373 PASS provider editor can switch from built-in to custom without changing hook order
4374 PASS provider editor renders the custom provider fields after the switch
4375 PASS custom provider editor exposes the explicit Kimi K3 reasoning protocol
4376 PASS custom provider editor exposes only one API address input
4377 PASS new custom providers start with an empty exact request address
4378 PASS provider URL input has a programmatic label and description
4379 PASS provider URL helper explains exact request behavior
4380 PASS new custom provider name stays editable
4381 PASS new custom provider editor omits the rename hint
4382 PASS DeepSeek Responses editor separates service capabilities from model selection
4383 PASS curated DeepSeek Responses capability is enabled in the editor
4384 PASS DeepSeek Responses exposes one model-selection checkbox
4385 PASS DeepSeek Responses editor does not use the read-only image-unsupported label
4386 PASS unverified LongCat Anthropic endpoint hides server-side web search
4387 PASS unverified LongCat endpoint exposes no recommended web-search switch
4388 PASS backend text-only metadata omits image badges outside the legacy endpoint heuristic
4389 PASS existing custom providers no longer expose an address mode selector
4390 PASS legacy base-only providers display their previously effective request URL
4391 PASS existing connection display name remains editable
4392 PASS stable provider identity remains separate from display name
4393 PASS legacy OpenAI chat URLs display their historically normalized effective endpoint
4394 PASS saving migrates the legacy effective address without rewriting its baseUrl
4395 PASS saving mirrors the normalized legacy OpenAI endpoint for previous releases
4396 PASS saving preserves an explicit requestUrl and independent baseUrl exactly
4397 PASS saving mirrors the exact OpenAI request URL for previous releases
4398 PASS protocol mismatch is a blocking editor error
4399 PASS recommended action applies the catalog request URL
4400 PASS recommended route clears the mismatch gate
4401 PASS save errors remain visible in the provider form
4402 PASS failed save retains connection and model drafts
4403
4404 57 passed, 0 failed, 57 total
4405
4406 ▶ src/__tests__/provider-editor-save-races.test.tsx
4407 PASS: controlled save success/failure, newer URL/key drafts, readback and out-of-order completion
4408
4409 ▶ src/__tests__/provider-endpoint.test.ts
4410
4411 provider endpoint
4412 PASS legacy OpenAI base URLs expose their effective request URL
4413 PASS legacy Anthropic base URLs expose their effective request URL
4414 PASS legacy Responses base URLs expose their effective request URL
4415 PASS legacy OpenAI chat URLs preserve historical trailing-slash normalization
4416 PASS legacy Anthropic chat URLs remain ignored
4417 PASS explicit request URLs remain unchanged and take priority
4418 PASS request URLs derive a query-free base URL for model discovery
4419 PASS unchanged legacy providers preserve their independent base URL
4420 PASS unchanged explicit request URLs preserve their independent base URL exactly
4421 PASS changing the request URL derives a new base URL
4422 PASS changing protocol derives a new base URL under the new protocol
4423 PASS new providers derive their base URL from the exact request URL
4424 PASS explicit format switch changes a standard suffix
4425 PASS Anthropic v1 is preserved when switching to chat
4426 PASS custom request paths and query values remain untouched
4427 PASS query-bearing exact overrides are never rewritten
4428 PASS official Anthropic route switches to the registered Chat route
4429 PASS official Anthropic route switches to the registered Responses route
4430 PASS custom gateway remains byte-for-byte unchanged
4431 PASS query-bearing official host override stays untouched
4432 PASS mixed DeepSeek path is blocked
4433 PASS mixed DeepSeek path recommends the catalog route
4434 PASS working DeepSeek root alias remains valid
4435 PASS shared Chat and Responses base remains valid
4436 PASS custom host is not catalog-rewritten
4437 PASS unknown custom path on the official host stays user-owned
4438
4439 ▶ src/__tests__/provider-failure-meta.test.ts
4440
4441 ▶ src/__tests__/provider-image-input.test.tsx
4442 PASS provider image input: draft/save/auto/cancel/disabled/hard-limit/stale discovery
4443
4444 ▶ src/__tests__/provider-model-discovery-selection.test.tsx
4445 PASS: discovery retains manual models and selection; new models are not auto-enabled; advanced fields start collapsed
4446
4447 ▶ src/__tests__/provider-model-refresh.test.ts
4448
4449 provider model refresh
4450 PASS newer grouped-provider refresh invalidates an older in-flight completion
4451 PASS provider edits invalidate an in-flight model refresh before it can publish stale state
4452 PASS appends discovered models without removing curated ones
4453 PASS background refresh preserves manually curated model list
4454 PASS background refresh does not re-add deleted models
4455 PASS manual access refresh preserves selected MiMo model instead of importing provider catalog
4456 PASS manual access refresh can show provider catalog as unsaved candidates
4457 PASS manual access refresh filters non-chat candidates before saving
4458 PASS matches backend non-chat model heuristic
4459 PASS detects likely image-capable chat model IDs
4460 PASS infers image-capable models without importing audio models
4461 PASS background refresh can populate an empty model list
4462 PASS preserves current default when it remains available
4463 PASS falls back to first saved model when default is unavailable
4464 PASS loads positive per-model context windows into editable drafts
4465 PASS merges model context edits while preserving other overrides and dropping removed models
4466 PASS drops non-finite model context values before crossing the desktop bridge
4467 PASS keeps output-only model overrides while editing context windows
4468 PASS warns only for positive context windows below 16384 tokens
4469 PASS keeps custom provider keyless when no key env or key value is supplied
4470 PASS creates a key env when saving an inline key for a new custom provider
4471 PASS creates a valid key env for a digit-leading custom provider
4472 PASS preserves an explicitly configured key env
4473 PASS generates valid stable key envs for digit-leading and non-ASCII provider names
4474 PASS preserves an explicitly configured legacy custom key env
4475 PASS separates provider selectability from key presence for no-auth providers
4476 PASS mock access removal hides built-ins and deletes custom providers
4477 PASS mock access removal does not mutate the previous settings snapshot
4478
4479 28 passed, 0 failed, 28 total
4480
4481 ▶ src/__tests__/provider-models-editor.test.tsx
4482 PASS provider model drafts, modal validation/focus/Escape, concurrent probes, add-only discovery, stale results
4483
4484 ▶ src/__tests__/provider-name-readonly.test.tsx
4485
4486 provider name readonly
4487 PASS English rename hint
4488 PASS Simplified Chinese rename hint
4489 PASS Traditional Chinese rename hint
4490 PASS disabled provider-name input is faded
4491 PASS disabled provider-name input uses not-allowed cursor
4492 PASS readonly hint uses the stronger secondary text color
4493 PASS no global mem-input:disabled fade rule remains
4494 PASS no global mem-select:disabled fade rule remains
4495 PASS new custom provider name stays editable
4496 PASS provider name keeps mem-input base styling
4497 PASS provider name carries the scoped provider-name-input class
4498 PASS new custom provider name has a stable input id
4499 PASS new custom provider name has a programmatic label
4500 PASS editable provider name omits the readonly description reference
4501 PASS new custom provider editor omits the rename hint
4502 PASS existing connection label is editable
4503 PASS connection label retains base styling
4504 PASS connection label has a programmatic label
4505 PASS stable identity is shown separately
4506 PASS obsolete rename restriction is absent
4507
4508 20 passed, 0 failed, 20 total
4509
4510 ▶ src/__tests__/provider-onboarding.test.tsx
4511 Provider onboarding: fresh setup, existing connection, ready state, ordinary settings and dismissal passed.
4512
4513 ▶ src/__tests__/provider-protocol.test.ts
4514 provider protocol: PASS
4515 provider protocol choices: PASS
4516
4517 ▶ src/__tests__/provider-vision-capability.test.ts
4518 PASS model override can disable a legacy vision list entry
4519 PASS adapter metadata enables native vision without VisionModels
4520 PASS adapter text-only metadata stays read-only
4521 PASS legacy provider-level unsupported capability remains a read-only fallback
4522 PASS model override enables native vision without VisionModels
4523 PASS supported model is marked read-only
4524 PASS unknown model stays conservative
4525 PASS mock ModelScope preserves model-level vision metadata
4526 provider vision capability: 8 passed, 0 failed
4527
4528 ▶ src/__tests__/query-coalesce.test.ts
4529 ok identical in-flight calls share one answer
4530 ok different arguments stay independent
4531 ok mutations invalidate in-flight answers
4532 ok a rejection is not shared onward
4533 ok external state boundaries invalidate settled answers
4534 ok settled tab lists do not cross mutations
4535 ok only read-only queries are coalesced
4536
4537 ▶ src/__tests__/read-status-upsert.test.ts
4538 read status upsert tests passed
4539
4540 ▶ src/__tests__/ready-event-meta-sync.test.tsx
4541
4542 ready event meta sync
4543 PASS startup begins one history hydration
4544 PASS startup history remains in flight before ancillary meta
4545 PASS ready event refreshes active tab metadata from ListTabs
4546 PASS ready event joins the in-flight hydrate instead of reloading history
4547 PASS ready event does not wait for ancillary MetaForTab before unlocking send
4548 PASS history still hydrates after the ready metadata sync
4549
4550 6 passed, 0 failed, 6 total
4551
4552 ▶ src/__tests__/ready-meta-reconcile.test.tsx
4553
4554 ready meta reconcile
4555 PASS startup begins one active-tab history hydration
4556 PASS startup fetches the active tab once
4557 PASS active tab metadata is polled after a missed ready event
4558 PASS ready polling is limited to the active tab
4559 PASS ready polling does not re-list or activate tabs
4560 PASS ready polling does not start another history hydration
4561 PASS ready polling does not rely on approval-mode changes
4562 PASS history still hydrates after ready reconciliation
4563
4564 8 passed, 0 failed, 8 total
4565
4566 ▶ src/__tests__/reasoning-display-preference.test.ts
4567
4568 reasoning display preference
4569 PASS missing preferences default to live follow
4570 PASS unknown preferences use the live-follow fallback
4571 PASS legacy summary-off preserves the old compatible behavior
4572 PASS legacy summary-on wins over the old expand flag
4573 PASS explicit new mode wins over every legacy preference
4574 PASS an explicit summary selection remains persisted
4575 PASS an explicit expanded selection remains persisted
4576 PASS resolver applies legacy precedence without hydration
4577 PASS successful selection applies the new mode
4578 PASS successful selection clears the legacy key
4579 PASS startup can hold reasoning until settings hydrate
4580
4581 11 passed, 0 failed
4582
4583 ▶ src/__tests__/reasoning-scroll-follow.test.tsx
4584
4585 reasoning inner-scroll follow
4586 PASS expanded reasoning uses the responsive height cap
4587 PASS expanded reasoning keeps full content internally scrollable
4588 PASS lazy reasoning reserves collapsed history geometry
4589 PASS lazy expanded reasoning reserves bounded geometry
4590 PASS new reasoning tokens follow the inner tail while armed
4591 PASS reasoning pane participates in nested-scroll handoff
4592 PASS manual upward reading releases automatic inner follow
4593 PASS returning within eight pixels of the bottom rearms follow
4594 PASS a new assistant segment starts with inner follow armed
4595 PASS an active follow tolerates a reasoning body that is not mounted
4596
4597 10 passed, 0 failed
4598
4599 ▶ src/__tests__/reasoning-summary.test.ts
4600
4601 reasoning summary
4602 PASS completed reasoning summarizes to the first non-blank line
4603 PASS streaming reasoning summarizes to the last non-blank line
4604 PASS leading blank lines are skipped when completed
4605 PASS trailing blank lines are skipped while streaming
4606 PASS trailing whitespace-only lines are skipped while streaming
4607 PASS handles CRLF line endings when completed
4608 PASS handles CRLF line endings while streaming
4609 PASS collapses intra-line whitespace
4610 PASS empty reasoning yields an empty summary
4611 PASS blank-only reasoning yields an empty summary
4612 PASS summaries are bounded to the default character budget
4613 PASS honors a custom character budget
4614 PASS long streaming lines retain the newest text within the character budget
4615 PASS a zero character budget yields an empty summary
4616 PASS a negative character budget clamps to zero
4617 PASS a one character budget contains only the truncation marker
4618 PASS truncation never splits a surrogate pair
4619 PASS completed summary does not split the whole input
4620 PASS streaming summary does not split the whole input
4621
4622 19 passed, 0 failed
4623
4624 ▶ src/__tests__/recoverable-toast-lifecycle.test.tsx
4625 recoverable toast lifecycle: current sink, single subscription and synchronous teardown passed
4626
4627 ▶ src/__tests__/recovery-banner-privacy.test.ts
4628
4629 quiet recovery prompt privacy
4630 PASS App does not render a persistent recovery banner
4631 PASS App does not expose recovery digest through recovery prompts
4632 PASS App does not expose parent session id through recovery prompts
4633 PASS App does not build a detailed recovery tooltip
4634
4635 4 passed, 0 failed
4636
4637 ▶ src/__tests__/recovery-lineage-dialog-heads.test.tsx
4638 PASS session version dialog lists log heads by head id
4639
4640 ▶ src/__tests__/recovery-lineage-dialog.test.tsx
4641 PASS session version dialog hides persistence details
4642 PASS session version dialog contains rejected backend calls as toasts
4643
4644 ▶ src/__tests__/recovery-quiet-notifications.test.ts
4645
4646 quiet recovery notifications and confirmed divergence
4647 PASS App does not render a recovery banner
4648 PASS App does not toast when a physical recovery copy is merely created
4649 PASS App has a dedicated confirmed-divergence toast
4650 PASS divergence is rechecked after catalog revisions
4651 PASS recovery failures are surfaced by the recovery host
4652 PASS App does not expose recovery acknowledgement controls
4653 PASS App does not expose recovery compare controls
4654 PASS App does not carry recovery compare failure text
4655 PASS controller centralizes quiet transcript notices
4656 PASS raw quiet notices are skipped before localization
4657 PASS localized quiet notices are skipped before rendering
4658 PASS en locale omits recovery.open
4659 PASS en locale omits recovery.toast
4660 PASS en locale omits recovery.failedLease
4661 PASS en locale omits recovery.failedUnavailable
4662 PASS en locale omits recovery.banner
4663 PASS en locale omits recovery.bannerCompare
4664 PASS en locale omits recovery.bannerDismiss
4665 PASS en locale omits recovery.openOriginalFailed
4666 PASS zh locale omits recovery.open
4667 PASS zh locale omits recovery.toast
4668 PASS zh locale omits recovery.failedLease
4669 PASS zh locale omits recovery.failedUnavailable
4670 PASS zh locale omits recovery.banner
4671 PASS zh locale omits recovery.bannerCompare
4672 PASS zh locale omits recovery.bannerDismiss
4673 PASS zh locale omits recovery.openOriginalFailed
4674 PASS zh-TW locale omits recovery.open
4675 PASS zh-TW locale omits recovery.toast
4676 PASS zh-TW locale omits recovery.failedLease
4677 PASS zh-TW locale omits recovery.failedUnavailable
4678 PASS zh-TW locale omits recovery.banner
4679 PASS zh-TW locale omits recovery.bannerCompare
4680 PASS zh-TW locale omits recovery.bannerDismiss
4681 PASS zh-TW locale omits recovery.openOriginalFailed
4682
4683 35 passed, 0 failed
4684
4685 ▶ src/__tests__/recovery-wait-banner.test.tsx
4686
4687 recovery wait banner
4688 PASS waiting recovery renders the banner
4689 PASS banner exposes the failure phase
4690 PASS headers phase reads as a provider outage
4691 PASS countdown derives from next_attempt_at
4692 PASS waited-so-far is shown against the wait budget
4693 PASS provider error code is shown
4694 PASS Stop calls the cancel action
4695 PASS connect phase reads as a network outage
4696 PASS an older kernel without a budget shows no waited-vs-budget line
4697 PASS no code chip without a provider code
4698 PASS short retries render no banner
4699 PASS waiting recovery renders the banner inside the composer area
4700 PASS banner sits directly above the composer card
4701 PASS run strip keeps the compact status line: "Waiting for provider (service unavailable); next attempt in 60s. Stop to cancel."
4702 PASS banner Stop calls onCancel exactly once
4703 PASS a short retry hides the banner
4704 PASS short retries keep the retrying status line
4705 PASS idle composer renders no banner
4706
4707 18 passed, 0 failed
4708
4709 ▶ src/__tests__/ref-token.test.tsx
4710
4711 ref token grammar
4712 PASS escapeRefPath escapes spaces
4713 PASS escapeRefPath leaves space-free paths alone
4714 PASS unescapeRefPath reverses escaping
4715 PASS unescapeRefPath keeps Windows separators literal
4716 PASS escape/unescape round-trips
4717 PASS active token keeps escaped spaces
4718 PASS unescaped space still ends the token
4719
4720 file reference menu
4721 PASS token splits dir/frag with escapes intact
4722 PASS frag is unescaped for entry matching
4723 PASS inline pick escapes whitespace in the inserted ref
4724 PASS inline pick through an escaped dir stays escaped once
4725
4726 composer pick
4727 PASS composer inline fallback escapes whitespace
4728 PASS no structured ref for a name-only entry
4729 PASS structured ref keeps the real unescaped path
4730 PASS structured pick removes the typed token
4731
4732 15 passed, 0 failed
4733
4734 ▶ src/__tests__/remote-composer-commands.test.tsx
4735 remote composer commands: management routing, source Goal/send, byte preservation, runtime ports and disposal passed
4736
4737 ▶ src/__tests__/remote-composer-presentation.test.tsx
4738 remote Composer: real file control, native drop boundary and running guidance preserve source routing
4739
4740 ▶ src/__tests__/remote-session-cache.test.ts
4741 PASS restores a current versioned snapshot
4742 PASS does not persist a transient blank session with a generated path
4743 PASS expires stale snapshots
4744 PASS removes an expired snapshot from storage
4745 PASS invalidates the legacy unversioned array schema
4746 PASS removes an invalid legacy snapshot
4747 PASS rejects malformed optional row fields
4748 PASS removes a malformed versioned snapshot
4749 PASS normalizes Go-omitted zero-value title and turns
4750 PASS explicit removal clears an unpinned project cache
4751
4752 10 remote session cache assertions passed.
4753
4754 ▶ src/__tests__/remote-switch-from-local.test.tsx
4755 PASS switching to a remote tab keeps the remote tab active
4756 PASS remote switch does not request local HistorySliceForTab
4757 PASS failed local hydrate must not revert SetActiveTab back to the local tab
4758 PASS SetActiveTab is called for the remote tab
4759
4760 4 passed, 0 failed
4761
4762 ▶ src/__tests__/remote-tab-opened.test.tsx
4763
4764 Remote tab opened/updated routing
4765 PASS opened events seed the new remote tab metadata
4766 PASS opened notifications cannot acquire navigation ownership
4767 PASS metadata updates patch the remote tab
4768 PASS metadata updates never steal focus
4769 PASS remote activation waits for navigation registration before backend focus
4770 PASS remote activation updates the selected tab
4771 PASS remote activation still binds backend focus
4772 PASS remote activation bypasses local history hydration
4773 PASS restored shell observes terminal state republished during activation
4774
4775 9 passed, 0 failed
4776
4777 ▶ src/__tests__/remote-topic-active.test.ts
4778 PASS matching remote identity is active
4779 PASS the same absolute path on another host stays inactive
4780 PASS remote rows never use an unqualified path-only fallback
4781
4782 ▶ src/__tests__/render-optimization.test.ts
4783 PASS shown.text stable when live.text unchanged
4784 PASS shown.reasoning stable when live.reasoning unchanged
4785 PASS shown.streaming stable when live unchanged
4786 PASS shown.reasoningComplete stable when live unchanged
4787 PASS shown.text updates when live.text changes
4788 PASS shown === item when no live stream
4789 PASS normalizeMath returns identical output for identical input
4790 PASS normalizeMath 100 calls in 0.7ms (should be <500ms)
4791 PASS highlightToHtml returns same HTML for identical code+lang
4792 PASS cached call (0.00ms) not slower than first call (6.09ms)
4793 PASS streaming code block highlighted in 0.43ms
4794 PASS streaming-adjacent code block is cached after first highlight
4795 PASS accumulated text is complete
4796 PASS last render text matches final accumulation
4797 PASS normalizeMath returns content for streamed text
4798 PASS normalizeMath is stable for repeated calls with same text
4799
4800 16 passed, 0 failed, 16 total
4801
4802 ▶ src/__tests__/resize-drag.test.ts
4803
4804 resizeDrag
4805 PASS live resize waits for animation frame
4806 PASS multiple pointer moves share one animation frame
4807 PASS one frame applies one live resize
4808 PASS live resize writes the configured CSS variable
4809 PASS live resize applies the latest rounded pixel value
4810 PASS live resize keeps separator ARIA in sync
4811 PASS pending final resize waits for animation frame before flush
4812 PASS flush applies the final resize before React state commits
4813 PASS live resize callback waits for animation frame
4814 PASS live resize callback receives the applied rounded value
4815 PASS resize lifecycle ignores other pointers and delivers the active pointer
4816 PASS pointer cancellation finishes the resize once
4817 PASS capture loss, blur, and component cleanup cannot finish a gesture twice
4818 PASS resize finish releases active pointer capture
4819
4820 14 passed, 0 failed, 14 total
4821
4822 ▶ src/__tests__/rewind-fork-routing.test.ts
4823 rewind fork routing contract passed
4824
4825 ▶ src/__tests__/rich-link-context-menu.test.tsx
4826
4827 rich link context menu
4828 PASS web link context menu opens on right click
4829 PASS pull request menu has three items (3)
4830 PASS pull request menu can open in the browser
4831 PASS pull request menu can copy the link
4832 PASS pull request menu can copy a reference
4833 PASS menu contains a "Copy reference" item
4834 PASS copy reference writes the owner/repo#number form (esengine/DeepSeek-Reasonix#6976)
4835 PASS a success toast confirms the copy
4836 PASS menu contains a "Copy reference" item
4837 PASS commit reference writes owner/repo@shortsha (esengine/DeepSeek-Reasonix@ca03d4c)
4838 PASS external menu has two items (2)
4839 PASS external menu has no reference action
4840 PASS menu contains a "Copy link" item
4841 PASS copy link writes the original URL (https://example.com/a/very/long/documentation/path)
4842 PASS menu contains a "Open in browser" item
4843 PASS open in browser sends the URL to the system browser
4844 PASS mailto menu offers compose email
4845 PASS mailto menu offers copy address
4846 PASS menu contains a "Copy email address" item
4847 PASS copy email address strips the mailto: scheme (support@example.com)
4848 PASS menu contains a "Compose email" item
4849 PASS compose email hands the mailto URL to the system handler
4850 PASS mail protocol classification is consistent
4851 PASS menu contains a "Copy email address" item
4852 PASS address copy for mailto:support@example.com?subject=Help&body=Hello
4853 PASS mail protocol classification is consistent
4854 PASS menu contains a "Copy email address" item
4855 PASS address copy for MAILTO:support@example.com
4856 PASS mail protocol classification is consistent
4857 PASS menu contains a "Copy email address" item
4858 PASS address copy for mailto:hello%2Btag@example.com
4859 PASS mail protocol classification is consistent
4860 PASS menu contains a "Copy email address" item
4861 PASS address copy for mailto:one@example.com,two@example.com?cc=other@example.com
4862 PASS mail protocol classification is consistent
4863 PASS menu contains a "Copy email address" item
4864 PASS address copy for mailto:bad%ZZ@example.com?subject=Help
4865 PASS mail protocol classification is consistent
4866 PASS menu contains a "Copy email address" item
4867 PASS address copy for mailto:?subject=Help
4868 PASS ContextMenu key opens the menu
4869 PASS keyboard menu focuses first action
4870 PASS Escape closes the menu
4871 PASS Escape returns focus to link
4872 PASS Shift+F10 opens the menu
4873 PASS menu contains a "Copy link" item
4874 PASS explicit label does not change what copy link writes
4875 PASS relative link right click is not intercepted
4876 PASS relative link opens no context menu
4877 PASS menu contains a "Copy link" item
4878 PASS a failed copy shows an error toast
4879
4880 51 passed, 0 failed
4881
4882 ▶ src/__tests__/running-tab-history-hydration.test.tsx
4883
4884 running tab history hydration
4885 PASS switching to the running session activates its tab
4886 PASS the running session keeps its live status
4887 PASS an uncached running session still hydrates its persisted history
4888 PASS the whole history page lands, not just the newest turn
4889 PASS switching to the streaming session activates its tab
4890 PASS a mid-stream session still fetches and installs its history
4891 PASS installing history leaves the live stream alone
4892 PASS the persisted page lands in front of the streaming turn
4893 PASS the streaming turn stays at the tail
4894
4895 9 passed, 0 failed
4896
4897 ▶ src/__tests__/runtime-job-owner.test.ts
4898 runtime job owner: source/UI ownership passed
4899
4900 ▶ src/__tests__/runtime-state-store.test.ts
4901 runtime state: immutable revisions, selectors, GET/SSE ordering, recovery, singleflight and disposal passed
4902
4903 ▶ src/__tests__/runtime-status-freshness.test.ts
4904 PASS runtime snapshots use event order and read freshness without trapping optimistic state
4905
4906 ▶ src/__tests__/runtime-status-lifecycle.test.tsx
4907 runtime polling: single flight, deterministic timers, terminal counts, source replacement and synchronous disposal passed
4908
4909 ▶ src/__tests__/runtime-topic-metadata.test.ts
4910 PASS: memory-only runtime topics preserve catalog metadata and structural sharing
4911
4912 ▶ src/__tests__/scroll-content-observer.test.ts
4913
4914 scroll content observer
4915 PASS observes existing transcript children
4916 PASS content child resize refreshes scrollbar metrics
4917 PASS observes children added after mount
4918 PASS child-list changes refresh scrollbar metrics
4919 PASS stops observing removed transcript children
4920 PASS disconnects the resize observer on cleanup
4921 PASS disconnects the mutation observer on cleanup
4922
4923 7 passed, 0 failed, 7 total
4924
4925 ▶ src/__tests__/search-footnotes-render.test.tsx
4926
4927 search sources panel render
4928 PASS answer body keeps the model text
4929 PASS sources panel renders under the answer
4930 PASS sources panel is collapsed by default
4931 PASS collapsed panel does not expose source details
4932 PASS click expands the sources panel
4933 PASS expanded panel shows the result title
4934 PASS source link uses the cleaned URL
4935 PASS expanded panel shows the hostname and short URL
4936 PASS answer markdown does not include the search title
4937
4938 9 passed
4939
4940 ▶ src/__tests__/search-sources.test.ts
4941
4942 search footnotes
4943 PASS footnotes reuse the title-and-autolink list
4944 PASS unsafe URLs are dropped
4945 PASS output parser keeps title-only hits
4946 PASS output parser keeps the title
4947 PASS output parser tolerates CRLF line endings
4948 PASS independent search parses only safe structured sources
4949 PASS search summary does not become a source title
4950 PASS empty native results stay empty
4951 PASS degraded footnote-markdown dump still resolves to one source
4952 PASS degraded dump strips the bullet and bold markers from the title
4953 PASS degraded dump unwraps the autolink URL
4954 PASS autolink-only lines parse as URL sources
4955 PASS duplicate hits collapse
4956 PASS normalization keeps only valid unique HTTP(S) sources
4957 PASS tracking parameters and fragments are removed
4958 PASS google redirect target is unwrapped and cleaned
4959 PASS source projection exposes the hostname
4960 PASS source projection exposes a compact URL
4961 PASS invalid, duplicate, and missing-title sources are counted as hidden
4962 PASS normalization does not mutate raw search data
4963 PASS answer text stays model-only
4964 PASS history hydrates footnotes on the answer
4965 PASS live answer stays model-only
4966 PASS live tool result attaches footnotes to the answer
4967 PASS sources attached to an active answer do not enter the pending buffer
4968 PASS multi-round search flow keeps three assistant segments
4969 PASS search sources attach to the immediately following answer
4970 PASS multiple pending searches accumulate before the answer starts
4971 PASS consumed search sources do not leak into later assistant segments
4972 PASS allocating an answer consumes the pending search-source buffer
4973 PASS history helper reads structured hits
4974
4975 31 passed
4976
4977 ▶ src/__tests__/selected-text-context.test.ts
4978
4979 selected text context
4980 PASS empty selections preserve the original submit bytes
4981 PASS selection context serialization is ordered, ID-free, trimmed, and boundary-safe
4982 PASS selection context parser recovers the trailing safe JSON payload
4983 PASS selection context parser ignores marker-shaped content outside the final suffix
4984 PASS selection context split preserves the editable submit prefix
4985 PASS selection context split preserves the exact validated suffix
4986 PASS malformed selection context stays local and non-fatal
4987 PASS workspace, chat, and terminal selections preserve their typed origins
4988 PASS terminal source round-trips through the persisted context parser
4989 PASS unknown future selection sources remain readable as generic quoted text
4990 PASS plan-revision rendering escalates the fence past embedded backtick runs and tags the language
4991 PASS unknown extensions render an untagged fence
4992 PASS newlines in file names stay escaped inside the quoted path
4993 PASS quotes and backslashes cannot break the path string
4994 PASS oversized selections report truncation
4995 PASS oversized selections have a deterministic maximum length
4996 PASS truncated selections keep a visible marker
4997 PASS selection snippets collapse layout whitespace
4998
4999 18 passed, 0 failed, 18 total
5000
5001 ▶ src/__tests__/send-failed.test.ts
5002
5003 send failure feedback
5004 PASS starting runtime cannot submit
5005 PASS lease-blocked runtime cannot submit
5006 PASS failed runtime cannot submit
5007 PASS ready runtime can submit
5008 PASS submit normalization trims provider input
5009 PASS handled management commands do not remain as conversation turns
5010 PASS handled management commands release the composer
5011 PASS visible display text cannot start an empty provider turn
5012 PASS old runtime epoch is rejected
5013 PASS current runtime epoch is accepted
5014 PASS first runtime epoch can establish the fence
5015 PASS legacy events remain compatible
5016 PASS submit appends the user bubble immediately
5017 PASS bubble carries the submitted text
5018 PASS submit marks the turn running
5019 PASS submit tracks the optimistic bubble
5020 PASS optimistic user bubble preserves submit-only context
5021 PASS matching TurnDone confirms without duplicating
5022 PASS matching submission id clears the pending marker
5023 PASS memory citations alone do not leave an empty assistant bubble
5024 PASS memory citations alone stay hidden from the transcript
5025 PASS memory citations preserve existing assistant text
5026 PASS memory citations attach to real assistant content
5027 PASS send_failed marks the bubble failed
5028 PASS send_failed appends a notice
5029 PASS the notice is a warning
5030 PASS send_failed stops the running indicator
5031 PASS send_failed clears the pending marker
5032 PASS rejected admission marks the exact optimistic bubble failed
5033 PASS rejected admission stays conservatively running until reconciliation
5034 PASS rejected admission restores the visible Ask gate
5035 PASS rejected admission preserves the pending Ask
5036 PASS authoritative active snapshot restores the existing turn id
5037 PASS authoritative active snapshot keeps the composer blocked
5038 PASS authoritative idle snapshot releases the rejected submit gate
5039 PASS authoritative idle snapshot clears a stale Ask
5040 PASS successful Ask submission clears the matching prompt
5041 PASS successful Ask submission tombstones the matching prompt id
5042 PASS late Ask success cannot clear a newer prompt
5043 PASS old prompt epoch cannot clear an id reused by a rebuilt controller
5044 PASS final readiness appends a notice
5045 PASS final readiness uses informational severity
5046 PASS final readiness uses the delivery status treatment
5047 PASS final readiness uses the explicit Delivery recovery title
5048 PASS final readiness explains the explicit Delivery recovery boundary
5049 PASS structured requirements produce localized detail
5050 PASS final readiness offers a recovery action
5051 PASS final readiness does not mark the delivered user message as failed
5052 PASS an unclicked continue-check action does not keep the turn running
5053 PASS an unclicked continue-check action does not create a pending prompt
5054 PASS reloaded readiness metadata restores the explicit action
5055 PASS reloaded readiness metadata restores structured detail
5056 PASS successful explicit recovery removes the stale delivery card
5057 PASS ordinary turn errors remain warnings
5058 PASS ordinary turn errors keep their diagnostic text
5059 PASS recovery_paused uses informational severity
5060 PASS recovery_paused shows a product title
5061 PASS recovery_paused uses the localized product copy
5062 PASS recovery_paused does not repeat the backend English fallback as localized detail
5063 PASS recovery_paused does not mark the user message as failed
5064 PASS recovery_paused frees the composer
5065 PASS completion_uncertain uses informational severity, not a send failure
5066 PASS completion_uncertain shows a product title
5067 PASS completion_uncertain uses the localized product copy
5068 PASS completion_uncertain does not mark the user message as failed
5069 PASS completion_uncertain frees the composer
5070 PASS rejected shell command appends a visible notice
5071 PASS shell rejection notice includes the backend error
5072 PASS send_failed after backend confirmation is a no-op
5073 PASS late send_failed leaves the confirmed transcript untouched
5074 PASS mcp_surface_ready is accepted as a deliberate no-op
5075 PASS mcp_surface_ready does not confirm a pending submit
5076 PASS send_failed still marks a pending submit after mcp readiness
5077 PASS TypeScript EventKind declares mcp_surface_ready
5078 PASS reducer handles mcp_surface_ready before optimistic confirmation
5079 PASS plan approval clears source plan mode before recording start execution
5080 PASS exit-without-executing records the explicit source-bound plan exit last
5081 PASS plan revision records only the source-bound revise decision
5082 PASS plan approval must not preserve stale plan restore intent
5083 PASS collaboration mode changes always reconcile the remembered plan restore intent
5084 PASS execution-mode switch state is gone from the app shell
5085 PASS composer submit stays behind the controller-ready gate
5086 PASS SetGoalForTab activation failures propagate to callers
5087 PASS ClearGoalForTab failures also propagate to callers
5088 PASS unsend clears the pending marker
5089 PASS unsend discards the in-flight turn
5090 PASS turn_done preserves out-of-order plan approval
5091 PASS preserved plan approval keeps the tab running
5092 PASS preserved plan approval keeps the prompt gate active
5093 PASS no active tab does not replay pending prompts
5094 PASS active tab switch replays pending prompts
5095 PASS replay bridge failures are swallowed by the tab-switch effect
5096
5097 delivery recovery continuation
5098 PASS delivery recovery without a Goal skips the resume call
5099 PASS delivery recovery without a Goal submits the continuation directly
5100 PASS delivery recovery cannot reacquire UI ownership after A → B → A
5101 PASS delivery recovery treats a blank Goal as absent
5102 PASS delivery recovery with a blank Goal still submits the continuation
5103 PASS delivery recovery with a Goal resumes it first
5104 PASS delivery recovery submits after the Goal resumes
5105 PASS an unresumable Goal is still offered the resume
5106 PASS an unresumable (completed) Goal does not submit the continuation
5107 PASS a tab switch during resume drops the continuation
5108 PASS delivery recovery waits for controller readiness
5109 PASS delivery recovery without an active tab is a no-op
5110
5111 104 passed, 0 failed
5112
5113 ▶ src/__tests__/session-catalog-presentation.test.ts
5114 session catalog presentation tests passed
5115
5116 ▶ src/__tests__/session-catalog-status-ownership.test.ts
5117 session catalog status ownership tests passed
5118
5119 ▶ src/__tests__/session-clear-commands.test.tsx
5120 session clear commands: pending lifecycle, local/remote chains, failure notices and empty-target gate passed
5121
5122 ▶ src/__tests__/session-clear-owner.test.ts
5123 session clear owner: source/UI ownership and local/remote paths passed
5124
5125 ▶ src/__tests__/session-control-commands.test.ts
5126 session control commands: canonical background target, active target, replacement, navigation and disposal passed
5127
5128 ▶ src/__tests__/session-diagnostics.test.ts
5129 PASS last activation present in snapshot
5130 PASS activation carries the tab id
5131 PASS ticket→starting derived
5132 PASS starting→ready derived
5133 PASS total covers the phases
5134 PASS ready activation has no failure class
5135 PASS failed outcome recorded
5136 PASS timeout classified
5137 PASS cancel class
5138 PASS stale class
5139 PASS missing class
5140 PASS other class
5141 PASS empty error is unknown
5142 PASS first terminal phase wins
5143 PASS all pages counted
5144 PASS stale pages counted
5145 PASS index + live-index count as hits
5146 PASS scan counts as a miss
5147 PASS last page stats win
5148 PASS mounted row counts flow through
5149 PASS markdown worker provider flows through
5150 PASS cache provider flows through
5151 PASS throwing provider is isolated
5152 PASS activation log bounded at 128 (got 128)
5153 PASS newest entries kept
5154 PASS reset drops activation/history
5155 PASS reset clears the log
5156
5157 27 passed, 0 failed
5158
5159 ▶ src/__tests__/session-experience-settings.test.tsx
5160 session experience controls: success, failure snapshot, busy state, legacy backend and keyboard reachability passed
5161
5162 ▶ src/__tests__/session-experience.test.ts
5163
5164 session experience
5165 PASS startup ignores stale localStorage before the backend snapshot
5166 PASS invalid startup values normalize to standard
5167 PASS standard collapses completed work
5168 PASS deep shows work while running
5169 PASS deep keeps completed work expanded
5170 PASS apply persists deep
5171 PASS canonical localStorage key stores deep
5172 PASS compatibility density mirror stays standard
5173 PASS deep mirrors the old expanded fold value
5174 PASS authoritative hydrate wins over stale localStorage
5175 PASS hydrate rewrites the canonical localStorage value
5176 11 checks passed
5177
5178 ▶ src/__tests__/session-export.test.ts
5179 session export tests passed
5180
5181 ▶ src/__tests__/session-mcp-list-export.test.ts
5182 ▶ session export MCP list attribution
5183 ✔ counts shared host, disk cache, and remote tools/list sources (1.410708ms)
5184 ✔ session export MCP list attribution (1.79775ms)
5185 ℹ tests 1
5186 ℹ suites 1
5187 ℹ pass 1
5188 ℹ fail 0
5189 ℹ cancelled 0
5190 ℹ skipped 0
5191 ℹ todo 0
5192 ℹ duration_ms 5.103083
5193
5194 ▶ src/__tests__/session-prompt-lifecycle.test.tsx
5195 session prompts: source, prompt identity, replacement, ABA, supersession and disposal passed
5196
5197 ▶ src/__tests__/session-recovery-runtime-failure.test.ts
5198 PASS failed recovery reconciliation stays local and preserves catalog-driven classification
5199
5200 ▶ src/__tests__/session-recovery-version-host-bridge.test.ts
5201 PASS session version host bridge preserves last-click-wins across lazy mounting
5202
5203 ▶ src/__tests__/session-recovery-version-host-lifecycle.test.tsx
5204 PASS session recovery host preserves pending classification across locale changes
5205
5206 ▶ src/__tests__/session-recovery-versions.test.ts
5207 PASS session recovery divergence state machine
5208
5209 ▶ src/__tests__/session-recovery.test.tsx
5210 PASS session recovery: source readiness, navigation errors, visible controls, retry coalescing and stale completion isolation
5211
5212 ▶ src/__tests__/session-submission-lifecycle.test.tsx
5213 session submission lifecycle: source continuations, Goal atomicity/bytes, replacement, failure, read-only and disposal passed
5214
5215 ▶ src/__tests__/session-takeover-ui.test.tsx
5216
5217 Session takeover UI lifecycle
5218 PASS background lease conflicts do not arm the active tab
5219 PASS the active lease-blocked tab exposes takeover
5220 PASS switching A to B requires B's own first confirmation click
5221 PASS second click reclaims only the armed tab
5222 PASS any reclaim in progress disables the active reclaim button
5223 PASS busy Escape is consumed without closing the takeover dialog
5224 PASS action failure remains visible and restores the dialog
5225 PASS Escape closes again after a failed action leaves busy state
5226
5227 8 passed, 0 failed
5228
5229 ▶ src/__tests__/session-title-contract.test.ts
5230
5231 session title contracts
5232 PASS History content search keeps physical-version notes out of the logical title
5233 PASS Legacy search hits without a topic title retain the session-title fallback
5234 PASS Cmd+K displays the topic title for topic-backed sessions
5235 PASS Cmd+K keeps per-version notes out of the logical session search contract
5236 PASS Cmd+K uses the content preview rather than a physical-version note
5237 PASS History displays the logical topic title instead of a physical-version note
5238 PASS Unrenamed topic-backed history sessions fall back to topic title
5239 PASS Blank session titles are not added as Cmd+K keywords
5240 PASS Cmd+K falls back to preview text in the hint when there is no custom session title
5241 PASS Cmd+K skips duplicate title hints that repeat the visible topic title
5242
5243 10 passed, 0 failed
5244
5245 ▶ src/__tests__/session-undo-lifecycle.test.tsx
5246 An update to Probe inside a test was not wrapped in act(...).
5247
5248 When testing, code that causes React state updates should be wrapped into act(...):
5249
5250 act(() => {
5251 /* fire events that update state */
5252 });
5253 /* assert on the output */
5254
5255 This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
5256 An update to Probe inside a test was not wrapped in act(...).
5257
5258 When testing, code that causes React state updates should be wrapped into act(...):
5259
5260 act(() => {
5261 /* fire events that update state */
5262 });
5263 /* assert on the output */
5264
5265 This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
5266 session undo lifecycle: code transaction retention, banners, failed rewinds and edit gates passed
5267
5268 ▶ src/__tests__/settings-navigation-contract.test.ts
5269
5270 settings navigation contract
5271 PASS desktop settings expose only workbench and creation
5272 PASS desktop settings no longer offer classic
5273 PASS switching settings pages resets both content scroll axes
5274 PASS the active settings page is exposed semantically
5275 PASS navigation metadata appears only in search results
5276 PASS model pages share one dedicated navigation group
5277 PASS model page navigation retains shared editor ownership
5278 PASS leaving model services hides rather than unmounts its drafts
5279 PASS model page routing has one navigation owner
5280
5281 9 passed, 0 failed, 9 total
5282
5283 ▶ src/__tests__/settings-options.test.tsx
5284 SettingsOptions keyboard, disabled state, selection semantics and form behavior passed
5285
5286 ▶ src/__tests__/settings-page-navigation.test.tsx
5287 PASS full-page settings, navigation, explicit return, Escape and focus restoration
5288
5289 ▶ src/__tests__/settings-provider-normalization.test.ts
5290
5291 settings provider normalization
5292 PASS provider snapshots normalize a null name at the settings boundary
5293 PASS provider snapshots normalize a null base URL at the settings boundary
5294 PASS provider snapshots preserve the GLM protocol
5295 PASS provider snapshots preserve server web-search capability
5296 PASS older snapshots keep an absent capability distinguishable
5297 PASS new custom providers keep the selected kind
5298 PASS existing providers preserve their stored kind
5299 PASS extra body editor formats stable JSON
5300 PASS extra body editor parses an object
5301 PASS extra body editor rejects non-object JSON
5302 PASS extra body editor localizes syntax errors
5303 PASS extra body editor retains the structured validation path
5304
5305 12 passed, 0 failed
5306
5307 ▶ src/__tests__/settings-refresh-snapshot.test.tsx
5308
5309 settings refresh snapshot
5310 PASS general settings place desktop style first
5311 PASS general settings hide executor and planner step-limit controls
5312 PASS session experience exposes an accessible choice group
5313 PASS general settings render the canonical session experience field
5314 PASS general settings do not render the retired density field
5315 PASS general settings do not render the retired reasoning field
5316 PASS general settings do not render the retired fold field
5317 PASS general settings keep automatic progress free of step-limit copy
5318 PASS general settings omit the retired automatic Plan Mode control
5319 PASS general settings omit retired automatic Plan Mode copy
5320 PASS session experience mutation is invoked once
5321 PASS legacy display mode mutation is not invoked
5322 PASS settings panel reads Settings only for initial load and post-save reload
5323 PASS onChanged receives the post-save SettingsView snapshot
5324 PASS failed session experience mutation is invoked once
5325 PASS failed save still reloads the authoritative Settings snapshot
5326 PASS failed save publishes the authoritative backend value
5327 PASS failed save reconciles the segmented control from the backend snapshot
5328 PASS compaction preference has no redundant advanced disclosure
5329 PASS compaction preference is visible without expanding a disclosure
5330 PASS compact ratio avoids a redundant token estimate under the selected row
5331 PASS compact ratio explains the recommended preset consequence
5332 PASS project override shows the active effective threshold
5333 PASS saved compact ratio starts selected
5334 PASS custom compaction is the fourth choice in the shared radio group
5335 PASS custom choice does not replace the saved preset before editing
5336 PASS preset selection leaves the inline custom input empty
5337 PASS inline custom input carries the requested percentage prompt
5338 PASS custom input stays inside the fourth choice row
5339 PASS custom row has no secondary apply or cancel actions
5340 PASS focusing an empty custom input preserves the saved preset
5341 PASS an empty custom draft is not announced as the saved selection
5342 PASS out-of-range inline compact ratio is not saved
5343 PASS invalid inline value stays available for correction
5344 PASS invalid inline value is exposed to assistive technology
5345 PASS Enter saves the inline custom compact ratio once
5346 PASS custom compact ratio converts percentage to fraction
5347 PASS saved custom compact ratio stays visible in the inline input
5348 PASS saved custom ratio selects the custom choice
5349 PASS custom choice keeps a stable accessible label after saving
5350 PASS Escape cancels a custom compact ratio without saving
5351 PASS Escape restores the saved inline custom ratio
5352 PASS compact ratio preset adds one mutation
5353 PASS compact ratio preset sends the expected fraction
5354 PASS saved compact ratio is selected after Settings reload
5355 PASS draft editing does not disable the preset before its click
5356 PASS preset click sends only one mutation while bridge is pending
5357 PASS explicit preset wins over an unsaved custom draft
5358 PASS clicked preset remains selected after the slow save
5359 PASS preset click clears the replaced custom draft
5360 PASS clicking the current preset cancels editing without saving the draft
5361 PASS current preset click clears the draft
5362 PASS ordinary blur still saves once
5363 PASS ordinary blur persists the draft
5364 PASS ordinary blur selects the saved custom threshold
5365 PASS failed save retains the custom draft
5366 PASS failed save preserves the persisted threshold
5367 PASS failed save displays its error
5368 PASS Enter retries the retained draft successfully
5369 PASS successful retry keeps the saved custom value visible
5370 PASS successful retry clears the error
5371 PASS subsequent rejection also retains the draft
5372 PASS Escape after failure restores the persisted value
5373 PASS Escape after failure does not write
5374 PASS failed initial settings load shows a visible error
5375 PASS failed initial settings load stops showing the loading state
5376 PASS settings retry calls Settings again
5377 PASS settings retry clears the load error
5378 PASS Windows Bash sandbox selector is disabled
5379 PASS Windows Bash sandbox selector is fixed to off
5380 PASS Windows Bash sandbox selector cannot open
5381 PASS Windows immutable Bash sandbox state does not save enforce
5382 PASS global monospace changes preserve an explicit code-region override
5383 PASS global monospace changes preserve the regional code font choice
5384 PASS global monospace changes keep the regional code font CSS variable
5385 PASS display zoom reset writes the default zoom factor
5386 PASS display zoom reset updates the local restart zoom cache
5387 PASS bots tab does not render the removed entry overview
5388 PASS bots tab no longer renders the mobile remote entry card
5389 PASS bots tab no longer renders the Bot Channel entry panel
5390 PASS bots tab omits the old global access step card
5391 PASS bots tab omits global default behavior card
5392 PASS hero no longer shows the old two-step chips
5393 PASS bot manager uses five fixed channel tabs on the left
5394 PASS unconfigured QQ tab shows key setup on the right
5395 PASS bot manager does not show a return-to-entry action
5396 PASS configured channel renders selected bot detail on the right
5397 PASS selected bot detail owns its access control
5398 PASS selected bot detail labels per-bot access control
5399 PASS selected bot detail places enable, approval, and model controls between summary and access control
5400 PASS selected bot detail shows its trusted user
5401 PASS advanced area keeps the legacy global allowlist
5402 PASS advanced area no longer owns mobile/control API setup
5403 PASS persisted ClientID is visible in the DingTalk detail card
5404 PASS DingTalk detail card exposes a test-send button
5405 PASS test-send button invokes TestDingtalkBot
5406 PASS provider auto-refresh cooldown uses the opaque catalog fingerprint
5407 PASS provider auto-refresh cooldown does not persist header secrets
5408 PASS leaving the models usage tab suppresses the stale background catalog write
5409 PASS cancelling discovery discards fetched candidates
5410 PASS cancelling discovery preserves configured models
5411 PASS protocol upgrade uses the structured settings service
5412 PASS DeepSeek protocol upgrade mutation is invoked once
5413 PASS persisted DeepSeek protocol upgrade disappears after a runtime refresh error
5414 PASS post-mutation reload preserves the original runtime error
5415 PASS onChanged receives the authoritative persisted protocol after a runtime error
5416
5417 106 passed, 0 failed, 106 total
5418
5419 ▶ src/__tests__/settings-select.test.tsx
5420 PASS shared settings select: keyboard, disabled, search, connection identity, dismiss and focus
5421
5422 ▶ src/__tests__/settings-storage-page.test.ts
5423
5424 settings storage page contract
5425 PASS Storage is immediately before Updates in the settings navigation
5426 PASS SettingsTab exposes the storage route before updates
5427 PASS Storage renders the same page on every platform
5428 PASS Storage data and UI are loaded only when its page bundle renders
5429 PASS General no longer embeds storage settings
5430 PASS Storage paths reuse the shared settings input recipe
5431 PASS Every storage path input is explicitly read-only
5432 PASS Storage mutation methods are absent from UI and desktop bridge surfaces
5433 PASS Storage page contains no migration-only styling
5434 PASS Storage page omits the redundant read-only notice
5435 PASS Storage page descriptions do not advertise Windows migration
5436 PASS Storage query performs no recursive size scan and exposes no synthetic models path
5437 PASS General SettingsView no longer owns storage data
5438 PASS Storage remains available when the general settings request fails
5439
5440 14 passed, 0 failed, 14 total
5441
5442 ▶ src/__tests__/shell-support-install.test.tsx
5443
5444 shell support guidance
5445 PASS accepts the exact official Git for Windows download URL
5446 PASS rejects an official-looking URL embedded in an attacker-controlled query
5447 PASS rejects an attacker-controlled hostname with the official hostname as a prefix
5448 PASS rejects a non-HTTPS download URL
5449 PASS Windows renders no automatic install button
5450 PASS Windows offers the official Git for Windows download link
5451 PASS Windows manual repair opens only the allowlisted official download URL
5452 PASS rendering Windows repair never calls InstallShellSupport
5453 PASS manual-only Windows repair never calls CancelShellInstall
5454 PASS Windows manual repair offers explicit re-detection
5455 PASS Windows re-detection reloads only after the user requests it
5456 PASS Windows re-detection refreshes the Settings snapshot once
5457 PASS re-detection still never calls the install binding
5458 PASS Linux never renders a Windows install entry
5459 PASS Linux detection reports zsh and POSIX sh alongside Bash
5460 PASS Linux missing Bash shows the distro repair command
5461 PASS Linux repair guidance never prescribes sudo
5462 PASS Linux repair command is copyable
5463 PASS copy action writes the exact allowlisted command
5464 PASS Linux manual repair offers explicit re-detection
5465 PASS Linux repair reload remains an explicit user action
5466 PASS macOS detection reports Bash and zsh
5467 PASS macOS native zsh fallback does not request a Bash install
5468 PASS macOS missing Git shows an independent Homebrew Git repair command
5469 PASS macOS Git repair copies brew install git only
5470 PASS macOS never renders the Windows install entry
5471
5472 26 passed, 0 failed
5473
5474 ▶ src/__tests__/shortcuts-recorder-focus.test.tsx
5475 PASS recorder button renders
5476 PASS composer undo appears in shortcut settings
5477 PASS composer redo appears in shortcut settings
5478 PASS composer undo stays locked to the native editing chord
5479 PASS composer redo stays locked to the native editing chord
5480 PASS composer undo shows Ctrl+Z on non-mac platforms
5481 PASS composer redo shows Ctrl+Shift+Z on non-mac platforms
5482 PASS clicking enters recording state
5483 PASS recorder button is focused after click (WebKit needs explicit focus)
5484 PASS combo press leaves recording state
5485 PASS Ctrl+Enter is saved as the custom combo
5486 PASS second click re-enters recording state
5487 PASS blur cancels the recording state
5488 PASS composer send recorder renders
5489 PASS non-Enter key keeps the composer recorder active
5490 PASS non-Enter key is not saved for composer send
5491 PASS non-Enter key shows an Enter-only validation message
5492 PASS Ctrl+Enter completes composer shortcut recording
5493 PASS Ctrl+Enter is saved for composer send
5494 PASS Escape cancels composer shortcut recording
5495 PASS Escape preserves the saved composer shortcut
5496 PASS Tab remains available for keyboard focus navigation
5497 PASS Tab releases focus when native traversal is unavailable
5498 PASS Tab exits composer shortcut recording
5499 PASS Tab preserves the saved composer shortcut
5500
5501 25 passed, 0 failed, 25 total
5502
5503 ▶ src/__tests__/skills-settings-refresh-race.test.tsx
5504 skills settings refresh race: passed
5505
5506 ▶ src/__tests__/sound.test.ts
5507
5508 sound notifications
5509 PASS legacy installs without a saved volume upgrade to the 70% default
5510 PASS notification volume saves a user-selected percentage
5511 PASS notification volume persists in its dedicated storage key
5512 PASS saved notification volume round-trips
5513 PASS notification volume clamps values above 100%
5514 PASS notification volume clamps values below 0%
5515 PASS invalid persisted volume recovers to the default
5516 PASS notification volume normalizes fractional values to an integer percentage
5517 PASS notification volume converts percentages to Web Audio gain
5518 PASS bundled WAVs use their measured loudness-normalization trims
5519 PASS WAV normalization never boosts a source above its recorded peak
5520 PASS the master volume scales a normalized WAV after its source trim
5521 PASS the 70% upgrade default raises the synthesized success peak above the legacy level
5522 PASS the 70% upgrade default keeps attention at least as audible as success
5523 PASS 0% prevents synthesized notifications from creating audio nodes
5524 PASS approval request builds a tab-scoped chime key
5525 PASS ask request builds a tab-scoped chime key
5526 PASS legacy approval events without a tab still build a stable key
5527 PASS non-attention events do not build chime keys
5528 PASS first approval event plays
5529 PASS replayed approval event for the same tab is deduped
5530 PASS same approval id from another tab still plays
5531 PASS ask id sharing an approval id still plays
5532 PASS malformed approval event does not play
5533 PASS dedupe set stays bounded after 2000 unique prompts
5534 PASS most recent prompt id is still deduped after pruning
5535 PASS rebuilt tab's reissued approval id chimes again
5536 PASS other tab's keys survive a scoped clear
5537 PASS tab-less ready clears every key
5538 sound notifications: 29 passed
5539
5540 ▶ src/__tests__/startup-gate-lifecycle.test.tsx
5541 startup gate: direct setup, StrictMode retirement, navigation generation and unmount passed
5542
5543 ▶ src/__tests__/startup-settings-contract.test.ts
5544
5545 startup settings contract
5546 PASS bridge exposes a lightweight desktop startup settings call
5547 PASS startup and reload barriers reject stale events while repeated session builds stay deduplicated
5548 PASS browser startup defaults include the canonical standard session experience
5549 PASS model settings honor access and statistics focus targets while preserving usage as the default
5550 PASS each fresh model focus object can re-target the same subtab again
5551 PASS usage statistics commands derive a monotonic request id from the shared focus state
5552 PASS provider setup uses the brand catalog instead of the former flat preset cards
5553 PASS account platform, plan and API format labels exist in every locale
5554 PASS GLM reasoning protocol is localized in every supported locale
5555 PASS session experience labels are localized in every supported locale
5556 PASS General controls use the selected flat responsive section layout
5557 PASS settings navigation provides searchable localized groups and visible category icons
5558 PASS Agent Skills navigation uses the dedicated reusable-workflow description in every supported locale
5559 PASS the superseded work-process-only visual group does not return
5560 PASS the retired standalone reasoning-summary setting does not return
5561 PASS sound settings expose the persisted notification volume control in every locale
5562 PASS browser mock hides the redundant DeepSeek Anthropic preset
5563 PASS browser mock preserves custom DeepSeek headers without proposing the retired protocol upgrade
5564 PASS browser onboarding installs the same current DeepSeek official template as production
5565 PASS official templates allow separate connections while preserving credential status
5566 PASS legacy official DeepSeek cards expose an explicit recommended-protocol action
5567 PASS grouped DeepSeek profiles update server-side web search through one atomic backend call
5568 PASS provider protocol migration stays in a stable row and removal lives in the overflow menu
5569 PASS provider cards keep descriptions out of the action row and collapse repeated diagnostics into compact details
5570 PASS all provider cards keep endpoint details collapsed and use backend web-search capability authority
5571 PASS legacy DeepSeek aliases remain grouped into one official provider card
5572 PASS multi-profile provider actions move into stable narrow-screen grid areas
5573 PASS narrow settings section headings stretch so descriptions wrap inside the viewport
5574 PASS the compact DeepSeek access and upgrade flows are localized in every supported locale
5575 PASS server web-search disclosure stays provider-neutral for compatible services
5576 PASS browser mock exposes the Token Rhythm preset
5577 PASS browser mock keeps OpenCode Go recommended first and DeepSeek Responses next
5578 PASS fresh installs have no onboarding dismissal marker
5579 PASS missing providers open the guide before dismissal
5580 PASS configured providers never open the guide
5581 PASS skip persists a versioned dismissal marker
5582 PASS persisted skip prevents repeated full-screen interruption
5583
5584 37 passed, 0 failed
5585
5586 ▶ src/__tests__/status-bar-items-editor.test.tsx
5587
5588 status bar items editor
5589 PASS collapsed editor exposes an accessible expand control
5590 PASS expanded editor labels the visible zone with its count
5591 PASS expanded editor labels the hidden zone with its count
5592 PASS hidden zone is an explicit drag target
5593 PASS clearing a visible item removes it from the persisted order
5594 PASS visible count updates after hiding an item
5595 PASS hidden count updates after hiding an item
5596 PASS hidden item moves into the hidden zone
5597 PASS show all restores hidden items without discarding the current visible order
5598 PASS keyboard order controls update the visible order
5599 PASS restore default returns all items to canonical order
5600
5601 11 passed, 0 failed, 11 total
5602
5603 ▶ src/__tests__/stream-interrupt-reason.test.ts
5604
5605 interrupted turn surfaces the last stream failure reason (#9560)
5606 PASS generic interrupted notice stays
5607 PASS warn notice explains the idle timeout
5608 PASS exactly one reason notice
5609 PASS connection_reset maps to a readable reason
5610 PASS a stop with no recorded failure adds no reason notice
5611 PASS stale reason from a previous turn is cleared on turn_started
5612 PASS terminal stream failure renders one warning
5613 PASS duplicate raw turn error is suppressed
5614 PASS recovery-required is terminal and frees the composer
5615 PASS recovery-required keeps the interrupted display notice
5616
5617 10 passed, 0 failed
5618
5619 ▶ src/__tests__/subagent-progress-card.test.tsx
5620
5621 subagent progress card
5622 PASS standard mode expands reasoning when the card mounts mid-stream
5623 PASS standard mode keeps the subagent card open after reasoning starts responding
5624 PASS standard mode keeps completed subagent reasoning expanded while the task runs
5625 PASS standard mode collapses the untouched subagent card after the task settles
5626 PASS deep mode opens live sub-agent reasoning
5627 PASS deep mode keeps completed sub-agent reasoning visible
5628 PASS manual card collapse still wins in deep mode
5629 PASS deep mode opens completed sub-agent reasoning restored from history
5630 PASS running card renders the progress chip
5631 PASS chip shows the phase label
5632 PASS chip shows the running elapsed
5633 PASS chip shows recent activity
5634 PASS chip carries the phase attribute
5635 PASS card head renders
5636 PASS active standard card renders the preview block
5637 PASS reasoning section label
5638 PASS active standard reasoning is not replaced by a summary
5639 PASS active standard reasoning renders full Markdown
5640 PASS response preview text visible
5641 PASS notice preview text visible
5642 PASS reasoning preview text visible after expanding
5643 PASS reasoning preview renders Markdown emphasis
5644 PASS reasoning preview renders Markdown lists
5645 PASS clicking the reasoning label collapses back to the summary
5646 PASS collapsed reasoning section shows the summary again
5647 PASS clicking the reasoning label expands the full Markdown
5648 PASS legacy summary-off cannot collapse active Standard reasoning
5649 PASS legacy summary-off keeps active process Markdown reachable
5650 PASS legacy summary-on leaves the canonical active preview intact
5651 PASS completed chip label
5652 PASS completed chip shows the terminal duration
5653 PASS terminal chip drops the recent-activity suffix
5654 PASS completed card shows the done icon
5655 PASS cancelled chip label
5656 PASS cancelled card shows the stopped icon
5657 PASS chip carries the cancelled modifier class
5658 PASS live outcome tuple renders through the lazy card boundary
5659 PASS live outcome keeps the stable subagent reference
5660 PASS live outcome exposes the bounded error code
5661 PASS history outcome is parsed only when the card is opened
5662 PASS history outcome uses the same localized status projection
5663
5664 subagent progress card: 41 passed, 0 failed
5665
5666 ▶ src/__tests__/subagent-progress.test.ts
5667
5668 subagent progress reducer
5669 PASS terminal status phase applied
5670 PASS reasoning preview routed to subagentProgress
5671 PASS text preview routed to subagentProgress
5672 PASS notice preview routed to subagentProgress
5673 PASS terminal duration captured
5674 PASS completed terminal maps to done status
5675 PASS preview never writes tool.output
5676 PASS settled parent assistant bytes unchanged by child previews
5677 PASS parent text unchanged by child previews
5678 PASS parent reasoning unchanged by child previews
5679 PASS unknown phase and unknown channel ignored
5680 PASS child 1 reasoning isolated
5681 PASS child 1 text isolated
5682 PASS child 2 reasoning isolated
5683 PASS child 2 text isolated
5684 PASS no child preview leaks into outputs
5685 PASS job id result keeps the card running
5686 PASS terminal progress settles the background card
5687 PASS background card phase completed
5688 PASS job id output retained
5689 PASS cancelled terminal wins over an error result
5690 PASS failed terminal maps to error status
5691 PASS fleet card stays running after the job-id result
5692 PASS all children terminal alone must not settle the fleet
5693 PASS group completed terminal settles the fleet
5694 PASS settled fleet phase completed
5695 PASS fleet stays running after the job-id result
5696 PASS a fast first child must not settle the fleet
5697 PASS fleet keeps running while a later child works
5698 PASS group terminal settles the fleet after all children
5699 PASS zero-child cancelled fleet shows stopped
5700 PASS group failed terminal maps to error
5701 PASS reasoning preview capped at 8 KiB
5702 PASS reasoning keeps the recent tail
5703 PASS text preview capped at 8 KiB
5704 PASS notice preview capped at 2 KiB
5705 PASS frontend cap alone does not mark truncated (backend sends the flag)
5706 PASS backend truncated flag honored
5707 PASS preview retained after terminal
5708 PASS history hydration never restores transient progress
5709 PASS nested dispatch flips parent phase to tool
5710 PASS nested dispatch refreshes parent recent activity
5711 PASS ordinary progress still appends to tool.output
5712 PASS ordinary tools never gain a progress preview
5713 PASS archived sub-agent card settles
5714 PASS subagentProgress survives result archiving
5715 PASS terminal outcome is normalized once at the result boundary
5716 PASS outcome metadata survives without retaining archived tool output
5717
5718 subagent progress: 48 passed, 0 failed
5719
5720 ▶ src/__tests__/submission-id-bridge-mock.test.ts
5721
5722 submission id browser mock contract
5723 PASS mock TurnStarted keeps the submitted tab scope
5724 PASS mock TurnStarted carries the local submission correlation
5725
5726 2 passed, 0 failed, 2 total
5727
5728 ▶ src/__tests__/subscription-scope.test.ts
5729 PASS subscription scopes fence queued notifications and release all resources
5730
5731 ▶ src/__tests__/tab-switch-hydration.test.tsx
5732
5733 tab switch hydration
5734 PASS SetActiveTab is called for the selected tab
5735 PASS switchTab updates the active tab before backend activation resolves
5736 PASS switchTab applies optimistic tab metadata immediately
5737 PASS uncached target tab does not keep the previous transcript visible
5738 PASS target tab shows lightweight hydration state while backend activation is pending
5739 PASS target tab gates unscoped actions while backend activation is pending
5740 PASS HistoryForTab is not requested before SetActiveTab completes
5741 PASS tab activation clears a stale approval already stored on the target tab
5742 PASS tab activation clears the stale prompt lifecycle before backend status arrives
5743 PASS tab-less events stay with the confirmed backend tab during optimistic activation
5744 PASS tab-less old-backend prompts cannot lock the optimistic target tab
5745 PASS newSession can target the selected tab before backend focus activation settles
5746 PASS newSession keeps the selected tab as its explicit target
5747 PASS backend focus completion does not duplicate the scoped new-session action
5748 PASS cached idle tab skips history hydration when reselected
5749 PASS late history for another tab does not change the active tab
5750 PASS late history for another tab does not overwrite the active transcript
5751 PASS late history stays scoped to its tab state
5752 PASS backend fallback sync activates the backend-selected cached tab
5753 PASS backend fallback sync keeps the cached transcript
5754 PASS backend fallback sync preserves cached history instead of reloading it
5755 PASS backend fallback sync reconciles stale approval state
5756 PASS backend fallback sync reconciles stale running state
5757 PASS switching to a backend-running tab updates the active tab immediately
5758 PASS backend-running tab restores the stop state before backend activation settles
5759 PASS backend-running tab restores the original turn timer before activation settles
5760 PASS backend-running tab remains cancellable before backend activation settles
5761 PASS cancel targets the backend-running tab while activation is pending
5762 PASS cancelled backend-running tab reconciles to idle after activation
5763 PASS switching to a prompt-blocked tab activates the requested tab
5764 PASS pending backend prompts are replayed after tab activation
5765 PASS a genuine pending approval survives the later hydration start
5766 PASS a genuine pending approval keeps the target tab running
5767 PASS first rapid switch activates the slow target optimistically
5768 PASS second rapid switch wins immediately
5769 PASS second rapid switch activates the backend
5770 PASS late completion from the first rapid switch does not replace the visible tab
5771 PASS late completion from the first rapid switch reasserts the last-clicked backend tab
5772 PASS late completion from the first rapid switch does not hydrate the stale target
5773 PASS failed backend tab switch reverts to the previous active tab
5774 PASS failed backend tab switch keeps the previous transcript visible
5775 PASS failed backend tab switch does not hydrate the rejected target
5776 PASS failed source rebind does not falsely restore the frontend source
5777 PASS failed source rebind keeps frontend and backend on the same target
5778 PASS agent ready with cached transcript skips executor-only history hydration
5779 PASS agent ready keeps cached planner phase
5780 PASS agent ready keeps cached planner answer
5781 PASS sendToTab resolves after optimistic dispatch before backend submit completes
5782 PASS switching to a cached running tab still updates the active tab
5783 PASS cached running tab keeps its optimistic transcript
5784 PASS the backend receives the same opaque correlation stored on the optimistic user
5785 PASS opaque submission correlation is distinct from the render item id
5786 PASS a running tab with no history page of its own still hydrates one
5787 PASS openProjectTab activates the opened tab
5788 PASS open topic keeps the new tab transcript empty while hydrating
5789 PASS cross-session open never reuses the source transcript as a placeholder
5790 PASS topic history clears visible hydration before ancillary phase 2 settles
5791 PASS agent ready reuses in-flight open-topic hydration for the active tab
5792 PASS background ready events do not hydrate the active tab
5793 PASS open topic hydration issues one context request
5794 PASS topic history replaces the hydration placeholder
5795 PASS topic history clears the hydration placeholder
5796 PASS reopening an already hydrated topic keeps it active
5797 PASS reopened cached topic keeps its transcript
5798 PASS reopening an already hydrated topic skips history hydration
5799 PASS reopening a topic reconciles stale approval state
5800 PASS reopening a topic reconciles stale running state
5801 PASS fork activates the forked tab
5802 PASS fork loads the forked transcript
5803 PASS fork reconciles backend running state after reset hydration
5804 PASS inactive topic skips ancillary hydration after quick tab switch
5805 PASS later A→D→A navigation returns to the source tab before fork completion
5806 PASS later A→D→A navigation owns backend focus before fork completion
5807 PASS late fork completion does not override newer ABA navigation
5808 PASS late fork completion reasserts the latest backend tab
5809 PASS stale fork result is not hydrated as the visible tab
5810 PASS rebound topic reloads history when session path changes
5811 PASS slow MetaForTab does not delay the history request
5812 PASS slow MetaForTab leaves optimistic metadata visible while history hydrates
5813 PASS late meta from a replaced tab does not switch the visible tab
5814 PASS late meta from a replaced tab does not overwrite visible metadata
5815 PASS third navigation remains visible after stale switch repair
5816 PASS third navigation remains backend-active after stale switch repair
5817 PASS third navigation remains visible after stale fork repair
5818 PASS third navigation remains backend-active after stale fork repair
5819 PASS changed session fingerprint reloads history instead of reusing same-path cache
5820 PASS matching fingerprint reuses the hydrated transcript after navigation
5821 PASS stale older page is discarded after session fingerprint changes
5822 PASS stale older page releases its loading state
5823 PASS stale older page enters the explicit retry state instead of silently auto-retrying
5824 PASS tab-l closes while its older page is deferred
5825 PASS late older-page completion cannot recreate the released tab state
5826 PASS late older-page completion cannot restore the evicted transcript
5827 PASS mismatched page and metadata trigger one bounded history reload
5828 PASS reconciled hydration does not retain the stale page
5829 PASS a foreground turn prevents mismatched durable history from being reloaded
5830 PASS durable reconciliation does not replace a live transcript
5831
5832 97 passed, 0 failed, 97 total
5833
5834 ▶ src/__tests__/tab-switch-session-rebind.test.tsx
5835
5836 tab switch session rebind
5837 PASS generation-rebound tab becomes the selected target
5838 PASS generation-rebound tab clears its prior session before history settles
5839 PASS generation-rebound tab never exposes prior-session placeholders
5840 PASS generation-rebound tab remains in target hydration after the App mask hands off
5841 PASS target history failure rebinds backend focus to the retained source session
5842 PASS target history failure restores the retained source transcript
5843 PASS target history failure never restores the prior target generation
5844 PASS backend sync is held before the newer same-tab navigation
5845 PASS newer same-tab navigation installs generation three identity
5846 PASS generation three history remains pending
5847 PASS stale same-tab sync cannot restore generation two metadata
5848 PASS stale same-tab sync cannot cancel generation three hydration
5849 PASS generation three remains the settled session identity
5850
5851 13 passed, 0 failed
5852
5853 ▶ src/__tests__/terminal-output-owner.test.ts
5854 terminal output owner: source/UI ownership passed
5855
5856 ▶ src/__tests__/terminal-panel-commands.test.tsx
5857 terminal commands: remote capability, warm mount exclusion, native key routing and disposal passed
5858
5859 ▶ src/__tests__/terminal-selection.test.ts
5860 terminal-selection: ok
5861
5862 ▶ src/__tests__/text-size.test.ts
5863
5864 text size shortcuts
5865 PASS increase from small
5866 PASS increase from default
5867 PASS increase from large
5868 PASS increase from xlarge
5869 PASS increase clamps at largest
5870 PASS decrease from xxlarge
5871 PASS decrease from xlarge
5872 PASS decrease from large
5873 PASS decrease from default
5874 PASS decrease clamps at smallest
5875
5876 10 passed, 0 failed, 10 total
5877
5878 ▶ src/__tests__/theme-auto-background.test.ts
5879
5880 theme auto native background contract
5881 PASS auto theme uses one shared light color-scheme media query
5882 PASS resolved auto theme reads the shared color-scheme query
5883 PASS applyTheme updates the native auto-theme listener
5884 PASS auto mode listens for color-scheme changes
5885 PASS explicit modes remove the color-scheme listener
5886 PASS non-auto themes clear the auto listener
5887 PASS color-scheme changes only sync native background while auto is active
5888 PASS reapplying auto does not register duplicate listeners
5889 PASS styles include the native workbench theme refresh section
5890 PASS workbench refresh has an auto-mode light media override
5891 PASS auto light mode keeps the workbench light background after late root overrides
5892 PASS auto light mode keeps the workbench light foreground after late root overrides
5893 PASS auto light mode keeps workbench panel surfaces aligned with forced light mode
5894 PASS creation assistant text has an explicit light-mode color adjustment
5895 PASS creation assistant text mirrors the light-mode color adjustment for auto light mode
5896 PASS creation assistant auto light text color matches forced light mode
5897
5898 16 passed, 0 failed, 16 total
5899
5900 ▶ src/__tests__/theme-editor-keyboard.test.tsx
5901
5902 theme editor keyboard ownership
5903 PASS normal Escape is consumed by the nested editor
5904 PASS normal Escape does not reach the outer Settings handler
5905 PASS normal Escape closes only the theme editor
5906 PASS normal Escape restores focus to the opener
5907 PASS save puts the editor into its busy state
5908 PASS busy Escape is still consumed by the nested editor
5909 PASS busy Escape does not close the outer Settings panel
5910 PASS busy Escape keeps the editor mounted until save completes
5911
5912 8 passed, 0 failed
5913
5914 ▶ src/__tests__/theme-pack.test.ts
5915
5916 theme pack contract
5917 PASS accepts #RRGGBB
5918 PASS accepts #RRGGBBAA
5919 PASS rejects url()
5920 PASS rejects gradient
5921 PASS token whitelist
5922 PASS code background is flattened to an opaque color
5923 PASS transparent bgSoft is composited over the theme background
5924 PASS every code and diff text role reaches WCAG AA on its rendered background
5925 PASS diff row backgrounds are pre-composited opaque colors
5926 PASS diff semantic text reaches WCAG AA on the final tinted row
5927 PASS midtone custom themes keep every syntax role readable on plain and tinted diff rows
5928 PASS generated custom palettes preserve WCAG AA across every rendered code surface
5929 PASS syntax direction follows final code luminance instead of global dark mode
5930 PASS graphite dark base code palette reaches WCAG AA
5931 PASS graphite dark preview uses the live code palette
5932 PASS graphite light base code palette reaches WCAG AA
5933 PASS graphite light preview uses the live code palette
5934 PASS aurora dark base code palette reaches WCAG AA
5935 PASS aurora dark preview uses the live code palette
5936 PASS aurora light base code palette reaches WCAG AA
5937 PASS aurora light preview uses the live code palette
5938 PASS slate dark base code palette reaches WCAG AA
5939 PASS slate dark preview uses the live code palette
5940 PASS slate light base code palette reaches WCAG AA
5941 PASS slate light preview uses the live code palette
5942 PASS carbon dark base code palette reaches WCAG AA
5943 PASS carbon dark preview uses the live code palette
5944 PASS carbon light base code palette reaches WCAG AA
5945 PASS carbon light preview uses the live code palette
5946 PASS nocturne dark base code palette reaches WCAG AA
5947 PASS nocturne dark preview uses the live code palette
5948 PASS nocturne light base code palette reaches WCAG AA
5949 PASS nocturne light preview uses the live code palette
5950 PASS amber dark base code palette reaches WCAG AA
5951 PASS amber dark preview uses the live code palette
5952 PASS amber light base code palette reaches WCAG AA
5953 PASS amber light preview uses the live code palette
5954 PASS Creation dark code palette reaches WCAG AA
5955 PASS Creation light code palette reaches WCAG AA
5956 PASS base stylesheet installs complete root and Creation code palettes
5957 PASS asset URL allowed
5958 PASS data URL allowed
5959 PASS remote URL rejected
5960 PASS registered same-origin official dev background allowed
5961 PASS cross-origin bundled background rejected
5962 PASS token-only preview keeps opaque panes
5963 PASS background preview applies configured pane opacity
5964 PASS sets data-theme-pack
5965 PASS marks background present
5966 PASS sets background image var
5967 PASS injects dark accent override
5968 PASS injects an opaque code readability island
5969 PASS injects contrast-checked syntax roles
5970 PASS applies round corners recipe
5971 PASS sets independent task image var
5972 PASS sets independent task opacity
5973 PASS computes home card pane opacity
5974 PASS computes task card pane opacity
5975 PASS computes home session-hover opacity tier
5976 PASS computes home child opacity tier
5977 PASS computes home interaction opacity tier
5978 PASS computes home operational overlay opacity tier
5979 PASS computes task session-hover opacity tier
5980 PASS computes task child opacity tier
5981 PASS caps task interaction opacity tier
5982 PASS caps task operational overlay opacity tier
5983 PASS task background controls safe area
5984 PASS home overlay follows pane opacity 0
5985 PASS task overlay follows pane opacity 0
5986 PASS home overlay follows pane opacity 0.5
5987 PASS task overlay follows pane opacity 0.5
5988 PASS home overlay follows pane opacity 1
5989 PASS task overlay follows pane opacity 1
5990 PASS legacy task scene inherits home pane opacity
5991 PASS scene task on root
5992 PASS scene home on root
5993 PASS clearing a pack removes every extended pane opacity tier
5994 PASS token-only themes keep operational overlays on the opaque base surface
5995 PASS token-only themes do not inject home overlay transparency
5996 PASS token-only themes do not inject task overlay transparency
5997 PASS applyTheme installs the base code readability stylesheet
5998 PASS preview applies pack
5999 PASS cancel restores cleared pack
6000 PASS activation failure surfaces to caller
6001 PASS activation failure keeps preview reversible
6002 PASS cancel restores appearance after activation failure
6003 PASS save-and-apply defers persistent activation to the experience controller
6004 PASS save-and-apply persists activation exactly once
6005 PASS save-and-apply activates before editor unmount
6006 PASS aurora pack active
6007 PASS pack switches live style to aurora
6008 PASS clear removes data-theme-pack
6009 PASS clear restores config graphite style
6010 PASS settings refresh preserves the active pack
6011 PASS settings refresh preserves the pack DOM marker
6012 PASS settings refresh preserves the pack effective style
6013 PASS settings refresh updates the configured restore appearance
6014 PASS clear restores the configured appearance after settings refresh
6015 PASS active pack effective style is not mirrored as configured base
6016 PASS direct reset still restores configured base after experience sync
6017 PASS inactive experience still synchronizes a newly selected base style
6018 PASS compact density vars defined in pack builder
6019 PASS compact density injected
6020 PASS compact row height injected
6021 PASS density pad consumed by cards
6022 PASS density gap consumed
6023 PASS density maps to list row height
6024 PASS layout background transparent when theme has background
6025 PASS token-only packs keep opaque layout surfaces
6026 PASS pane transparency keeps block code and diff opaque while preserving inline-code styling
6027 PASS home cards consume pane opacity tier
6028 PASS task cards consume pane opacity tier
6029 PASS preview cards consume the same pane opacity tier
6030 PASS background layer only displays for packs with backgrounds
6031 PASS ThemeLibrary cleanup cancels preview
6032 PASS import confirm reuses staged path without re-picking
6033 PASS import handles needsReplace result
6034 PASS ThemeGallery does not use native confirm dialogs
6035 PASS ThemeLibrary does not use native confirm dialogs
6036 PASS theme flows share the Reasonix confirm dialog
6037 PASS confirm dialog exposes accessible modal semantics
6038 PASS destructive confirmations use danger styling
6039 PASS confirm dialog supports Escape and focus restoration
6040 PASS gallery cancellation restores focus after closing its overflow menu
6041 PASS overlay style id stable
6042 PASS overlay style appended last for priority
6043 PASS tracks base appearance for restore
6044 PASS background layer CSS present
6045 PASS task scene CSS present
6046 PASS theme pack CSS does not apply backdrop-filter
6047 PASS overlay wash element styled
6048 PASS session export owner wires scene from session content
6049 PASS App mounts background layer
6050 PASS reset entry exists
6051
6052 official themes (kind/grouping/i18n)
6053 PASS kind official passthrough
6054 PASS kind base passthrough
6055 PASS kind user passthrough
6056 PASS legacy builtin=true falls back to base
6057 PASS legacy builtin=false falls back to user
6058 PASS appearance overview present
6059 PASS overview has browse themes
6060 PASS overview can disable pack
6061 PASS settings pages retain accessible names without a duplicate visual header
6062 PASS base-style copy opens a prefilled theme editor
6063 PASS overview segmented controls expose selection semantics
6064 PASS overview choices use the shared field-width control
6065 PASS overview does not retain standalone segmented controls
6066 PASS overview choices share the bounded responsive field width
6067 PASS overview segmented controls expand on narrow screens
6068 PASS Creation compact swatches stay scoped to real theme cards
6069 PASS Creation appearance hero keeps readable swatch dimensions
6070 PASS Creation Graphite appearance hero keeps the gold accent palette
6071 PASS custom UI font selection exposes an editable font name
6072 PASS custom monospace font selection exposes an editable font name
6073 PASS font family selectors render localized names
6074 PASS active pack explains why base style is locked
6075 PASS gallery cards are listbox options
6076 PASS apply lives in gallery detail
6077 PASS card click selects without applying
6078 PASS changing gallery groups synchronizes the selected detail
6079 PASS apply path uses activate API
6080 PASS base style API wired
6081 PASS selection is frontend state
6082 PASS gallery thumbs lazy-load
6083 PASS isolated detail preview
6084 PASS theme preview includes real code and diff samples
6085 PASS base gallery cards render semantic UI thumbnails
6086 PASS immersive rail renders base-style thumbnails
6087 PASS graphite light uses its canonical preview palette
6088 PASS graphite dark uses its canonical preview palette
6089 PASS aurora light uses its canonical preview palette
6090 PASS aurora dark uses its canonical preview palette
6091 PASS slate light uses its canonical preview palette
6092 PASS slate dark uses its canonical preview palette
6093 PASS carbon light uses its canonical preview palette
6094 PASS carbon dark uses its canonical preview palette
6095 PASS nocturne light uses its canonical preview palette
6096 PASS nocturne dark uses its canonical preview palette
6097 PASS amber light uses its canonical preview palette
6098 PASS amber dark uses its canonical preview palette
6099 PASS six base previews have distinct dark accents
6100 PASS all gallery card clicks immediately start a global preview
6101 PASS gallery preview state is visible in theme details
6102 PASS leaving all themes restores the prior appearance
6103 PASS detail and immersive views share preview controls
6104 PASS appearance and scene previews are separate radio groups
6105 PASS preview controls expose selected values
6106 PASS preview radios support arrow keys and roving focus
6107 PASS immersive selection automatically starts a global preview
6108 PASS leaving immersive preview restores the prior appearance
6109 PASS redundant global-trial button is removed
6110 PASS immersive rail includes official, user, and base theme groups
6111 PASS immersive rail hides empty groups
6112 PASS immersive rail has no duplicate bottom tab navigation
6113 PASS active theme uses a status badge
6114 PASS active status is not rendered as a disabled primary action
6115 PASS user theme edit and export actions are visible outside the overflow menu
6116 PASS user theme overflow menu keeps only delete
6117 PASS editor supports an independent workspace image
6118 PASS editor exposes semantic theme colors
6119 PASS editor exposes scene opacity controls
6120 PASS content-area control exposes radio semantics and guidance
6121 PASS editor changes are previewed live
6122 PASS bridge exposes GetThemeExperience
6123 PASS bridge exposes ActivateBaseStyle
6124 PASS bridge exposes DisableThemePack
6125 PASS gallery combines official and base packs in all themes
6126 PASS all themes keeps flagship and base sections
6127 PASS catalog sections retain accessible grouping
6128 PASS base styles are no longer a separate top-level tab
6129 PASS empty user tab is not overwritten by selection seeding
6130 PASS overview no longer renders long style card grid
6131 PASS en has settings.themes.official.official-rose-dawn.name
6132 PASS zh has settings.themes.official.official-rose-dawn.name
6133 PASS zh-TW has settings.themes.official.official-rose-dawn.name
6134 PASS en has settings.themes.official.official-rose-dawn.description
6135 PASS zh has settings.themes.official.official-rose-dawn.description
6136 PASS zh-TW has settings.themes.official.official-rose-dawn.description
6137 PASS en has settings.themes.official.official-fortune-forge.name
6138 PASS zh has settings.themes.official.official-fortune-forge.name
6139 PASS zh-TW has settings.themes.official.official-fortune-forge.name
6140 PASS en has settings.themes.official.official-fortune-forge.description
6141 PASS zh has settings.themes.official.official-fortune-forge.description
6142 PASS zh-TW has settings.themes.official.official-fortune-forge.description
6143 PASS en has settings.themes.official.official-crimson-horizon.name
6144 PASS zh has settings.themes.official.official-crimson-horizon.name
6145 PASS zh-TW has settings.themes.official.official-crimson-horizon.name
6146 PASS en has settings.themes.official.official-crimson-horizon.description
6147 PASS zh has settings.themes.official.official-crimson-horizon.description
6148 PASS zh-TW has settings.themes.official.official-crimson-horizon.description
6149 PASS en has settings.themes.official.official-sage-breeze.name
6150 PASS zh has settings.themes.official.official-sage-breeze.name
6151 PASS zh-TW has settings.themes.official.official-sage-breeze.name
6152 PASS en has settings.themes.official.official-sage-breeze.description
6153 PASS zh has settings.themes.official.official-sage-breeze.description
6154 PASS zh-TW has settings.themes.official.official-sage-breeze.description
6155 PASS en has settings.themes.official.official-spark-notebook.name
6156 PASS zh has settings.themes.official.official-spark-notebook.name
6157 PASS zh-TW has settings.themes.official.official-spark-notebook.name
6158 PASS en has settings.themes.official.official-spark-notebook.description
6159 PASS zh has settings.themes.official.official-spark-notebook.description
6160 PASS zh-TW has settings.themes.official.official-spark-notebook.description
6161 PASS en has settings.themes.official.official-violet-starlight.name
6162 PASS zh has settings.themes.official.official-violet-starlight.name
6163 PASS zh-TW has settings.themes.official.official-violet-starlight.name
6164 PASS en has settings.themes.official.official-violet-starlight.description
6165 PASS zh has settings.themes.official.official-violet-starlight.description
6166 PASS zh-TW has settings.themes.official.official-violet-starlight.description
6167 PASS en has settings.themes.official.official-cyan-stage.name
6168 PASS zh has settings.themes.official.official-cyan-stage.name
6169 PASS zh-TW has settings.themes.official.official-cyan-stage.name
6170 PASS en has settings.themes.official.official-cyan-stage.description
6171 PASS zh has settings.themes.official.official-cyan-stage.description
6172 PASS zh-TW has settings.themes.official.official-cyan-stage.description
6173 PASS en has settings.themes.official.official-noir-gold.name
6174 PASS zh has settings.themes.official.official-noir-gold.name
6175 PASS zh-TW has settings.themes.official.official-noir-gold.name
6176 PASS en has settings.themes.official.official-noir-gold.description
6177 PASS zh has settings.themes.official.official-noir-gold.description
6178 PASS zh-TW has settings.themes.official.official-noir-gold.description
6179 PASS gallery key settings.themeGallery.title in all locales
6180 PASS gallery key settings.themeGallery.apply in all locales
6181 PASS gallery key settings.themeGallery.browse in all locales
6182 PASS gallery key settings.themeGallery.paletteLabel in all locales
6183 PASS gallery key settings.themeGallery.appearancePreview in all locales
6184 PASS gallery key settings.themeGallery.scenePreview in all locales
6185 PASS gallery key settings.themeGallery.scenePreviewHint in all locales
6186 PASS gallery key settings.themeGallery.tabAll in all locales
6187 PASS gallery key settings.themeGallery.sectionFlagship in all locales
6188 PASS gallery key settings.themeEditor.safeAreaHint in all locales
6189 PASS gallery key settings.themeLibrary.confirmDeleteTitle in all locales
6190 PASS gallery key settings.themeLibrary.confirmReplaceImportTitle in all locales
6191 PASS gallery key settings.themeLibrary.replaceConfirm in all locales
6192 PASS gallery key settings.themeLibrary.exportRightsTitle in all locales
6193 PASS gallery key settings.themeLibrary.exportConfirm in all locales
6194 PASS mock has 6 base packs
6195 PASS mock has 8 official packs
6196 PASS browser mock has 8 real official previews
6197 PASS browser mock has 8 real official backgrounds
6198 PASS browser mock gives every official theme the product pane opacity
6199 PASS Vite dev server permits only the official theme asset directory
6200 PASS gallery establishes its own responsive container
6201 PASS gallery collapses from its content width
6202 PASS theme editor escapes settings containing blocks through a body portal
6203 PASS theme editor portal retains accessible dialog semantics
6204 PASS theme editor establishes an independent responsive container
6205 PASS theme editor collapses from its own width
6206 PASS all editor segmented setting buttons share available width
6207 PASS base appearance options wrap at narrow editor widths
6208 PASS preview dimensions have labeled layout styling
6209 PASS scene preview explains home and workspace behavior
6210 PASS scene options use explicit Chinese labels
6211 PASS gallery explains click-to-preview and apply-to-save semantics
6212 PASS English restore copy names Graphite and preserves detailed typography
6213 PASS Chinese restore copy localizes Graphite as 石墨 and preserves detailed typography
6214 PASS user theme edit and export actions share a balanced row
6215 PASS immersive rail groups have lightweight headings and item stacks
6216 PASS active status has dedicated non-button styling
6217 PASS content-area guidance has dedicated responsive styling
6218 PASS code and diff surfaces consume the opaque code background
6219 PASS live and preview diff rows consume the same pre-composited safe backgrounds
6220 PASS Chinese content-area copy explains foreground placement
6221 PASS pack overlay never targets layout-scoped selectors
6222 PASS auto mode follows system light/dark
6223 PASS ThemeLibrary module retained for editor/helpers
6224
6225 305 passed, 0 failed
6226
6227 ▶ src/__tests__/todo-panel-lifecycle.test.tsx
6228 todo panel lifecycle checks passed
6229
6230 ▶ src/__tests__/tool-approval-mode.test.ts
6231
6232 tool approval mode
6233 PASS ask restores to ask
6234 PASS auto restores to auto
6235 PASS yolo cannot be a restore base
6236 PASS Ctrl+Y turns ask into yolo
6237 PASS Ctrl+Y remembers ask
6238 PASS Ctrl+Y turns auto into yolo
6239 PASS Ctrl+Y remembers auto
6240 PASS Ctrl+Y restores auto from yolo
6241 PASS Ctrl+Y falls back to ask when no restore base exists
6242 PASS English Ask copy is not presented as read-only
6243 PASS Simplified Chinese Ask copy is not presented as read-only
6244 PASS Traditional Chinese Ask copy is not presented as read-only
6245 PASS heartbeat Ask hint preserves the same boundary
6246 PASS Plan copy names permissions and sandbox
6247 PASS English Full access preserves fresh-review boundary
6248 PASS Simplified Chinese Full access preserves fresh-review boundary
6249 PASS Traditional Chinese Full access preserves fresh-review boundary
6250 PASS Full access does not promise to bypass every approval
6251 PASS English YOLO status preserves fresh-review boundary
6252 PASS Simplified Chinese YOLO status preserves fresh-review boundary
6253 PASS Traditional Chinese YOLO status preserves fresh-review boundary
6254 PASS English YOLO setting names ordinary prompts only
6255 PASS Simplified Chinese YOLO setting names ordinary prompts only
6256 PASS Traditional Chinese YOLO setting names ordinary prompts only
6257
6258 24 passed, 0 failed, 24 total
6259
6260 ▶ src/__tests__/tool-card-command.test.tsx
6261 PASS shell command visibility, exact copy, archived retry and identity fencing
6262
6263 ▶ src/__tests__/tool-card-error-details.test.tsx
6264
6265 tool card error details
6266 PASS duplicate error output is not rendered as a code block
6267 PASS compact error summary is visible
6268 PASS full error details are hidden by default
6269 PASS long receipt list is not visible before expansion
6270 PASS full error details render after expansion
6271
6272 5 passed, 0 failed, 5 total
6273
6274 ▶ src/__tests__/tool-card-running-elapsed.test.tsx
6275
6276 tool card running elapsed
6277 PASS dispatch creates a running card
6278 PASS dispatch stamps startedAt from the frontend clock
6279 PASS the full dispatch keeps the partial dispatch's startedAt
6280 PASS running card shows a live elapsed label at dispatch
6281 PASS running card registers exactly one ticker
6282 PASS live elapsed label advances with the clock
6283 PASS live elapsed label keeps advancing
6284 PASS unmount clears the ticker
6285 PASS sub-agent card registers exactly one ticker (no double tick)
6286 PASS sub-agent card leaves elapsed to its progress chip
6287 PASS sub-agent chip still ticks (got "running · 5s · 5s ago")
6288 PASS tool_result settles the card
6289 PASS completed card shows the final duration
6290 PASS completed card registers no ticker
6291 PASS completed card's duration does not drift with the clock
6292 PASS running card without startedAt hides the elapsed label
6293 PASS running card without startedAt does not tick
6294 PASS turn_stalled appends a transcript notice
6295 PASS turn_stalled notice keeps its warn level
6296 PASS turn_stalled notice text is localized by code
6297 PASS turn_stalled does not change the running flag
6298 PASS turn_stalled does not end the turn
6299 PASS turn_stalled does not touch the stream-interrupt flag
6300 PASS localizedNoticeText maps turn_stalled to the English copy
6301 PASS zh copy for turn_stalled
6302 PASS zh-TW copy for turn_stalled
6303
6304 26 passed, 0 failed, 26 total
6305
6306 ▶ src/__tests__/tool-card-shell-execution.test.tsx
6307
6308 tool card shell execution
6309 PASS live path: tool item created
6310 PASS live path: bash result marked isShell
6311 PASS live path: execution.shell preserved
6312 PASS live path: exitCode preserved
6313 PASS live path: failurePhase preserved
6314 PASS live path: card shows Windows PowerShell (got "Windows PowerShell")
6315 PASS live path: summary shows exit/phase (got "exit 1 · execution · 42 ms")
6316 PASS live path: partial mutation risk visible
6317 PASS live path: execution failure must not show not-run label
6318 PASS live path: stderr details element present after expand affordance
6319 PASS live path: Chinese stderr from execution.outputTail is visible in the DOM
6320 PASS timed_out: shows partial mutation risk
6321 PASS timed_out: does not claim command never ran
6322 PASS cancelled: shows partial mutation risk
6323 PASS cancelled: does not claim command never ran
6324 PASS history path: one tool item
6325 PASS history path: bash isShell
6326 PASS history path: execution restored
6327 PASS history path: not_started risk
6328 PASS history path: shell name bash (got "bash")
6329 PASS history path: preflight shows command-not-run (not partial)
6330 PASS history path: preflight must not claim partial file modification
6331 PASS archive path: tool_result archives large output
6332 PASS archive path: output dropped after archive
6333 PASS archive path: execution survives compactArchivedToolItems
6334 PASS archive path: exitCode survives archive
6335 PASS archive path: card still shows Windows PowerShell without re-fetch
6336 PASS archive path: partial risk still visible when execution retained
6337 PASS archive rehydrate: shell name after expand (got "Windows PowerShell")
6338 PASS archive rehydrate: exit/phase after expand (got "exit 1 · execution · 42 ms")
6339 PASS archive rehydrate: partial risk after expand
6340 PASS nil execution falls back to bash label
6341 PASS nil execution still renders shell card without throwing
6342
6343 33 passed, 0 failed, 33 total
6344
6345 ▶ src/__tests__/tool-data-archive.test.ts
6346
6347 tool data archiving on tool_result
6348 PASS tool item exists after tool_result
6349 PASS single tool is archived immediately
6350 PASS output is dropped
6351 PASS args truncated to ≤200 chars (got 201)
6352 PASS 50 tools present
6353 PASS all 50 tools archived immediately
6354 PASS all tools have output dropped
6355 PASS all args ≤200 chars (max 201)
6356 PASS no crash when tool output is undefined
6357 PASS tool exists while running
6358 PASS tool is running
6359 PASS running tool not archived yet
6360 PASS running tool keeps full args
6361 PASS tool archived after result
6362 PASS output dropped after result
6363 PASS 500 tools present
6364 PASS total string size 100,500 ≤ 102,500 (98% of max)
6365 PASS archive removed 99% of tool string data
6366 PASS history restored one archived tool
6367 PASS history archived tool is marked archived
6368 PASS history archived tool has no output
6369 PASS history archived tool has no args
6370 PASS history archived tool keeps subject
6371 PASS history archived tool keeps summary
6372 PASS history restore avoids large args/output strings
6373 PASS history restored older todo_write
6374 PASS history restored latest todo_write
6375 PASS older todo_write args are truncated during history restore
6376 PASS older todo_write no longer keeps full JSON
6377 PASS latest todo_write keeps full args during history restore
6378 PASS latest todo_write args remain parseable JSON
6379 PASS first live todo_write result is recorded
6380 PASS latest live todo_write result is recorded
6381 PASS older live todo_write stays archived
6382 PASS older live todo_write args are truncated
6383 PASS latest live todo_write still marks output as archived
6384 PASS latest live todo_write keeps full args
6385 PASS latest live todo_write args remain parseable JSON
6386 PASS previous successful todo_write remains canonical after a later failure
6387 PASS failed todo_write args are truncated
6388 PASS failed todo_write keeps error status
6389 PASS older todo_write args stay archived when latest todo_write clears the list
6390 PASS older todo_write does not keep full JSON after a clear
6391 PASS empty todo_write clear keeps parseable canonical args
6392 PASS empty todo_write clear remains parseable as the latest canonical list
6393
6394 45 passed, 0 failed, 45 total
6395
6396 ▶ src/__tests__/tool-subject.test.ts
6397
6398 tool subject contract
6399 PASS task subject uses description
6400 PASS run_skill subject uses skill name
6401 PASS use_capability subject uses capability_id
6402 PASS use_capability list falls back to action
6403 PASS old proxy history fails closed as visible
6404 PASS resolved reader history restores read-only classification
6405 PASS resolved writer history restores writer classification
6406 PASS history keeps resolved MCP target
6407 PASS legacy built-in reader remains read-only
6408 PASS provider web search cards are read-only
6409 PASS provider web search stays a standalone card
6410 PASS ordinary readers still batch
6411 PASS legacy search reader remains read-only
6412 PASS legacy unresolved proxy remains fail-closed
6413 PASS unknown history tool remains fail-closed
6414 PASS server search hydrates as a tool card before the answer
6415 PASS server search card uses web_search
6416 PASS search card subject is the query
6417 PASS search card keeps structured sources for display
6418 PASS search card preserves raw output for replay/history
6419 PASS model text stays a separate assistant item
6420 PASS answer text does not include search results
6421 PASS answer hydrates search footnotes
6422
6423 23 passed
6424
6425 ▶ src/__tests__/topic-activation.test.tsx
6426
6427 topic activation (ticketed)
6428 PASS B applies optimistically on its ticket
6429 PASS B shows the hydrating surface until its terminal event
6430 PASS C applies optimistically over B
6431 PASS superseded terminal events do not flip the visible tab
6432 PASS superseded terminal events never hydrate
6433 PASS C still waits for its own terminal event
6434 PASS starting does not hydrate
6435 PASS only the last click's history is visible
6436 PASS A applies optimistically
6437 PASS failed activation restores the previously committed source tab
6438 PASS restored source is immediately usable
6439 PASS failed activation retains the source transcript
6440 PASS failure notice is sanitized before it reaches the restored source
6441 PASS target history failure retains the source controller transcript
6442 PASS target history failure does not expose a local path
6443 PASS tab:meta merges the refreshed git branch
6444 PASS tab:meta merges the refreshed image-input capability
6445 PASS tab:meta for a different session binding is discarded
6446 PASS reattached thinking session stays marked running
6447 PASS running-session hydrate settles instead of leaving Welcome
6448 PASS switch-back selects the thinking session
6449 PASS switch-back does not present the other session as a hydration placeholder
6450 PASS switch-back keeps the composer in the live turn
6451 PASS switch-back does not keep the other session as the visible transcript
6452 PASS switch-back clears the foreign placeholder after live history lands
6453 PASS Ask is visible before activation history hydrates
6454 PASS transient Ask history failure stays on the selected session
6455 PASS transient Ask history failure retries without a second click
6456 PASS transient Ask history retry remains blocked on user input
6457 PASS transient Ask history retry remains running
6458 PASS transient Ask history retry preserves the decision card
6459
6460 31 passed, 0 failed
6461
6462 ▶ src/__tests__/topic-summary-commands.test.tsx
6463 topic summary commands: identity memo, single-flight fetch, revision refetch and failure clearing passed
6464
6465 ▶ src/__tests__/topicbar-actions-lifecycle.test.tsx
6466 topicbar lifecycle: 128 replacements retain one action group and no orphan DOM
6467
6468 ▶ src/__tests__/topicbar-controls.test.ts
6469 topicbar static presentation contracts passed
6470
6471 ▶ src/__tests__/topicbar-region.test.tsx
6472 An empty string ("") was passed to the src attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to src instead of an empty string.
6473 topicbar region: DOM structure, source commands, focus, rename keys and action identity passed
6474
6475 ▶ src/__tests__/topicbar-session-actions.test.tsx
6476
6477 topicbar direct session actions and export navigation
6478 PASS all four session actions are directly available without opening a menu
6479 PASS one click invokes each direct action, including asynchronous copy
6480 PASS focusing the terminal action prefetches its panel
6481 PASS one export click opens all four formats and focuses the first
6482 PASS ArrowUp wraps to the last format
6483 PASS Home focuses the first format
6484 PASS ArrowDown advances to the next format
6485 PASS End focuses the last format
6486 PASS Escape closes export and restores trigger focus
6487 PASS ArrowUp on the export trigger opens at the final format
6488 PASS format selection dispatches export, closes the menu, and restores focus
6489 PASS markdown export retains its callback
6490 PASS json export retains its callback
6491 PASS pdf export retains its callback
6492 PASS moving focus outside export dismisses it without stealing focus
6493 PASS pointer interaction outside dismisses export
6494 PASS switching sessions clears the previous export menu
6495 PASS empty sessions disable export and remote surfaces disable terminal
6496 PASS disabled actions neither run nor prefetch
6497
6498 19 passed, 0 failed
6499
6500 ▶ src/__tests__/transcript-command.test.tsx
6501 PASS stable Transcript commands use committed state without cross-render callback chains
6502
6503 ▶ src/__tests__/transcript-scroll-diagnostics.test.ts
6504 transcript scroll diagnostics tests passed
6505
6506 ▶ src/__tests__/transcript-snapshot-client.test.ts
6507 transcript snapshot client races, field-selective content and complete tool details: ok
6508
6509 ▶ src/__tests__/transcript-store.test.ts
6510
6511 transcript store
6512 PASS paged read pause equals live and legacy history presentation
6513 PASS reloading a pause does not duplicate its card
6514 PASS latest page projects items
6515 PASS latest page reports older history
6516 PASS history user items retain their absolute turn for complete-session navigation
6517 PASS every paged user item carries an absolute history turn
6518 PASS paged concatenation equals single-shot conversion (228 items from 286 messages)
6519 PASS newest page item ids are stable across prepends
6520 PASS item ids are unique across the full projection
6521 PASS 10,000-turn target paging reaches the first page
6522 PASS 10,000-turn target paging respects both turn and production entry bounds
6523 PASS 10,000-turn target paging performs the expected bounded backend calls
6524 PASS targeted pages use the backend's bounded 1000-entry capacity
6525 PASS 10,000-turn target paging preserves every question
6526 PASS 10,000-turn target paging lands on absolute turn one
6527 PASS 10,000-turn target paging keeps the tail coordinate
6528 PASS 10,000-turn target paging keeps item ids unique
6529 PASS 10,000-turn transcript stays within the production history body budget
6530 PASS 10,000-turn targeted paging completes within 10s (1326.4ms)
6531 PASS result row converts standalone before its call pages in
6532 PASS standalone result keeps the toolCallId item id
6533 PASS older page prepends
6534 PASS the standalone result item is superseded by the merged call item
6535 PASS exactly one tool item after the merge (no duplicate)
6536 PASS merged tool item takes the call's args
6537 PASS merged tool item takes the result's output
6538 PASS merged tool item is done
6539 PASS merged projection equals single-shot conversion
6540 PASS append contributes the new rows' items
6541 PASS append keeps existing item ids
6542 PASS append grows the projection
6543 PASS three sessions resident at the cap
6544 PASS fourth session evicts the least-recently-used one
6545 PASS new session stays resident
6546 PASS pinned sessions do not count toward the resident cap
6547 PASS pinned live session survives eviction
6548 PASS oldest unpinned session evicts instead
6549 PASS evicted session re-opens via a fresh slice fetch
6550 PASS re-opened session restores its full projection
6551 PASS history body budget holds across sessions
6552 PASS byte budget evicts the oldest by weight
6553 PASS newest session survives byte-budget eviction
6554 PASS markdown cache returns stored value
6555 PASS markdown LRU evicts the least-recently-used entry
6556 PASS recently read markdown entry survives
6557 PASS markdown entries key on entryId + revision
6558 PASS active selection pins its markdown projection
6559 PASS refs in the newest page auto-fetch their chunks
6560 PASS fixture fits in one page
6561 PASS resolved full content replaces the inline preview
6562 PASS content resolution notifies subscribers with item patches
6563 PASS resolved content is served from the record
6564 PASS resolved content is not re-fetched
6565 PASS stale ref keeps the inline preview
6566 PASS latest page still projects
6567 PASS superseded load discards its late response
6568 PASS the latest load wins
6569 PASS evicted session discards its late response
6570 PASS evicted records never land
6571 PASS auto-fetch of the first load is in flight
6572 PASS late content chunk from a previous generation is discarded
6573 PASS stale cursor triggers a latest-page reload
6574 PASS reload replaces with the fresh newest page
6575 PASS paging resumes after the reload
6576 PASS older page prepends after reload
6577 PASS matching canonical fingerprint reuses the resident projection
6578 PASS resident projection retains its canonical revision
6579 PASS changed same-path fingerprint bypasses the resident projection
6580 PASS fresh projection adopts the advanced canonical digest
6581 PASS positive legacy slice revision implies a known canonical identity
6582
6583 70 passed, 0 failed
6584
6585 ▶ src/__tests__/trash-management.test.tsx
6586 PASS trash page, stale preview, confirmation focus, recovery exclusion, failed-only retry and post-success refresh failure
6587
6588 ▶ src/__tests__/trash-operations.test.ts
6589 PASS trash partial failure, fixed targets, deduplication and explicit failed-only retry
6590
6591 ▶ src/__tests__/turn-action-copy.test.ts
6592
6593 turn action copy
6594 PASS keeps single assistant output unchanged
6595 PASS accumulates multiple assistant outputs in one turn
6596 PASS does not add an extra blank line when the previous block already ends with newline
6597 PASS does not add an extra blank line when the next block starts with newline
6598 PASS ignores whitespace-only assistant fragments
6599
6600 5 passed, 0 failed
6601
6602 ▶ src/__tests__/turn-event-projection-reset.test.ts
6603 turn event projection reset tests passed
6604
6605 ▶ src/__tests__/turn-lifecycle-reducer.test.ts
6606 turn lifecycle reducer tests passed
6607
6608 ▶ src/__tests__/turn-metrics.test.ts
6609 turn metrics: all assertions passed
6610
6611 ▶ src/__tests__/turn-timing-race.test.ts
6612 turn timing snapshot ordering
6613 PASS a stale running snapshot cannot resurrect a completed turn
6614 PASS a stale running snapshot cannot rewind a newer turn clock
6615 PASS an unordered status keeps a surviving newer local clock
6616 PASS a stale idle snapshot cannot stop a newer live turn
6617 PASS a newer backend start still corrects an earlier local fallback
6618
6619 5 passed, 0 failed
6620
6621 ▶ src/__tests__/turn-verification-commands.test.tsx
6622 turn verification commands: dock reveal, sequenced requests and reset lifecycle passed
6623
6624 ▶ src/__tests__/typography-preferences.test.ts
6625
6626 regional typography preferences
6627 PASS regions follow global by default
6628 PASS code uses its semantic base size
6629 PASS metadata defaults to the existing 12px supporting-text size
6630 PASS oversized values clamp to the region maximum
6631 PASS undersized values clamp to the region minimum
6632 PASS custom names are normalized
6633 PASS missing regions retain backward-compatible defaults
6634 PASS unsafe CSS delimiters are rejected
6635 PASS safe custom font input remains editable
6636 PASS unsafe custom font input is blocked before state changes
6637 PASS preset resolves to a usable font stack
6638 PASS custom regions expose an exact CSS size
6639 PASS code exposes an exact CSS size independent of root tokens
6640 PASS disabling metadata follow-global preserves its rendered size
6641 PASS metadata uses the same base as the global supporting-text token
6642 PASS follow-global regions clear stale exact sizes
6643 PASS applied preferences remain persisted
6644
6645 17 passed, 0 failed, 17 total
6646
6647 ▶ src/__tests__/ui-perf-scenarios.test.ts
6648 PASS 01: one reducer pass per frame at most (127 commits / 127 frames)
6649 PASS 01: markdown parses bounded by blocks, not ticks (8 for 8 paragraphs)
6650 PASS 01: full answer reached the live stream
6651 PASS 02: state commits stay at or under display FPS (60.0/s)
6652 PASS 02: visible reasoning Markdown stays within its parse budget (1)
6653 PASS 02: answer Markdown keeps its existing parse budget (16)
6654 PASS 02: full reasoning reached the live stream
6655 PASS 02: answer text after reasoning completed it
6656 PASS 03: commits bounded by frames (840/840)
6657 PASS 03: open fences keep committing so streamed code stays highlighted (20 parses)
6658 PASS 03: parse cadence capped by the 50ms tier even inside fences (20 parses / 840 frames)
6659 PASS 05: transcript carries the long session (231 items)
6660 PASS 05: per-delta cost is O(1) — no transcript cloning while streaming over a long session
6661 PASS 05: commits bounded by frames on a long transcript (203/203)
6662 PASS 06: background streaming never trips the whole-App bump — liveStore only
6663 PASS 06: background reasoning performs no Markdown parsing
6664
6665 16 passed, 0 failed
6666
6667 ▶ src/__tests__/ui-perf.test.ts
6668 PASS empty sample set has no percentile
6669 PASS single sample is its own percentile
6670 PASS p50 of 10 evenly spread samples
6671 PASS p95 of 10 samples takes the top sample
6672 PASS bridge event rate buckets by per-second rate
6673 PASS state commit rate buckets by per-second rate
6674 PASS stream→paint p95 buckets in ms
6675 PASS frame p95 under one display frame
6676 PASS slow frame percentage buckets
6677 PASS input latency over budget lands in the top bucket
6678 PASS markdown render p95 within budget
6679 PASS no long tasks reports zero
6680 PASS DOM size buckets
6681 PASS JS heap buckets
6682 PASS sub-second turns report no rates
6683 PASS missing samples are omitted, not reported as zero
6684 PASS long task count still buckets
6685 PASS bridge events counted
6686 PASS state commits counted
6687 PASS turn duration from injected clock
6688 PASS frame p95 from sampled frame durations
6689 PASS one of two frames over 33ms
6690 PASS dispatch→frame latency sampled on the next frame
6691 PASS DOM size snapshot at finish
6692 PASS heap snapshot at finish
6693 PASS turn_done reports exactly once
6694 PASS reported signals come from the turn's own counters
6695 PASS no reporting outside a turn
6696
6697 28 passed, 0 failed
6698
6699 ▶ src/__tests__/use-controller-cancel-reconcile.test.tsx
6700
6701 use controller cancel reconcile
6702 PASS sequence gap replays the durable missing prefix once
6703 PASS gap replay keeps the stable sampling-segment item id
6704 PASS future event projects only after the missing prefix
6705 PASS duplicate sequence is ignored idempotently
6706 PASS turn_started marks the tab running
6707 PASS cancel reconciliation clears the running state
6708 PASS CancelTab is called once
6709 PASS cancel reconciliation clears cancelRequested
6710 PASS cancellation never reloads or replaces the transcript
6711 PASS cancelled prompt stays in the projected transcript
6712 PASS cancelled prompt keeps its conversation checkpoint
6713 PASS an immediate stop still has the optimistic prompt item
6714 PASS immediate cancellation does not schedule a transcript hydrate
6715 PASS immediate cancellation keeps the optimistic prompt bubble
6716 PASS immediate cancellation keeps the rewind checkpoint
6717 PASS resubmission survives the completed cancellation cleanup
6718 PASS resubmission cannot race a stale cancellation history response
6719 PASS TurnDone does not request the full checkpoint-turn history
6720 PASS SetEffortForTab is called once
6721 PASS busy effort switch surfaces a non-failure warning notice
6722 PASS cancel returns only backend-confirmed withdrawn IDs
6723 PASS receipt-capable cancellation is called for durable guidance
6724 PASS cancel failure formats the stable inbox code for the active locale
6725 PASS cancel failure never renders the stable transport code
6726 PASS turn_started with a turn id records the active turn
6727 PASS exact-turn stop is attempted first
6728 PASS fence rejection falls back to the unconditional CancelTab
6729 PASS fence rejection does not surface a Cancel failed notice
6730 PASS idle stop still asks the backend once
6731 PASS idle stop does not retry through CancelTab
6732 PASS idle stop does not surface a Cancel failed notice
6733 PASS event gap recovery never replays a state-changing command
6734 PASS event gap recovery retains projected user item identities
6735 PASS same-session event repair does not reload mounted history
6736
6737 34 passed, 0 failed, 34 total
6738
6739 ▶ src/__tests__/use-controller-history-live-race.test.tsx
6740
6741 use controller history/live race
6742 PASS turn starts while history is pending
6743 PASS late history keeps the live turn running
6744 PASS late history keeps the live assistant stream
6745 PASS late history lands in front of the live turn
6746 PASS late history leaves the live turn at the tail
6747
6748 5 passed, 0 failed, 5 total
6749
6750 ▶ src/__tests__/use-controller-live-context.test.tsx
6751
6752 use controller live context refresh
6753 PASS initial completed-turn context loads
6754 PASS initial DeepSeek balance loads
6755 PASS executor usage refreshes all-source context before turn_done
6756 PASS status bar renders the live executor-era session average
6757 PASS panel ignores its stale private snapshot and matches the status bar
6758 PASS usage triggers a new ContextUsageForTab snapshot
6759 PASS live subscriber receives the coalesced text burst
6760 PASS live subscriber receives the first provider-output timestamp
6761 PASS pure stream deltas do not re-render the controller owner
6762 PASS subagent usage also refreshes the shared all-source context
6763 PASS status bar renders the live all-source session average
6764 PASS panel stays aligned after a burst usage update
6765 PASS subagent usage does not replace the executor latest-request metric
6766 PASS first live snapshot starts
6767 PASS newer live snapshot starts
6768 PASS newest usage snapshot wins
6769 PASS status bar follows the newest usage snapshot
6770 PASS panel follows the same newest usage snapshot
6771 PASS late stale snapshot cannot regress the status bar
6772 PASS late stale snapshot cannot regress the rendered average
6773 PASS late stale snapshot cannot regress the panel average
6774 PASS pre-switch balance refresh starts
6775 PASS starting a hot model switch immediately hides the DeepSeek balance
6776 PASS rapid model switches enter the backend in click order
6777 PASS superseded model switch reports that it no longer owns the UI
6778 PASS latest model switch starts after the older backend call
6779 PASS superseded switch cannot restore its provider balance
6780 PASS latest model switch owns the completed UI refresh
6781 PASS latest model switch balance wins
6782 PASS only the active model switch enters the backend immediately
6783 PASS an unstarted intermediate model switch is coalesced
6784 PASS the latest coalesced model switch starts after the active call
6785 PASS the latest coalesced model switch owns reconciliation
6786 PASS the skipped intermediate model never reaches the backend
6787 PASS three rapid picks perform only two controller rebuilds
6788 PASS late DeepSeek balance response cannot overwrite the latest switched provider
6789 PASS older successful switch stays hidden while the latest switch is pending
6790 PASS latest failed switch reports failure
6791 PASS failed latest switch refreshes the provider established by the older queued success
6792 PASS failed latest switch reconciles metadata from the older queued success
6793 PASS a failing switch hides the outgoing balance while pending
6794 PASS failed model switch reports failure to its caller
6795 PASS failed switch restores the known balance when its confirmation refresh fails
6796 PASS queued failing switches keep the outgoing balance hidden while pending
6797 PASS queued failing switches enter the backend in click order
6798 PASS superseded queued failure does not own balance reconciliation
6799 PASS latest queued failing switch starts after the older failure
6800 PASS superseded queued failure cannot restore the outgoing balance
6801 PASS latest queued failure reports failure
6802 PASS consecutive queued failures restore the pre-queue balance when confirmation fails
6803 PASS failed close keeps the in-flight model switch current
6804 PASS failed close keeps the tab mounted
6805 PASS failed close preserves model metadata reconciliation
6806 PASS failed close preserves model balance reconciliation
6807
6808 54 passed, 0 failed, 54 total
6809
6810 ▶ src/__tests__/use-controller-meta.test.ts
6811
6812 use controller meta
6813 PASS model busy guard names the background-job blocker
6814 PASS effort busy guard names the running-answer blocker
6815 PASS model busy guard is localized
6816 PASS model lease conflict explains the safe path
6817 PASS model startup race asks the user to retry later
6818 PASS model tab race asks the user to retry
6819 PASS model unknown error is localized
6820 PASS model provider access error is localized
6821 PASS effort busy guard is worded as temporary
6822 PASS effort lease conflict explains the safe path
6823 PASS effort startup race asks the user to retry later
6824 PASS effort tab race asks the user to retry
6825 PASS effort true failure keeps the underlying error
6826 PASS backend autosave notice is localized through the active dictionary
6827 PASS backend save-before-action notice localizes the action
6828 PASS backend model fallback notice is localized
6829 PASS legacy recovery branch notice can be normalized without exposing internal branch id
6830 PASS recovery copy notice can be normalized
6831 PASS legacy repeated recovery conflict notice can be normalized
6832 PASS repeated recovery conflict notice can be normalized
6833 PASS adopted transcript notice can be normalized
6834 PASS covered adopted transcript notice can be normalized
6835 PASS canonical backend notice is routed through the locale dictionary
6836 PASS dynamic background job notice is user-facing
6837 PASS a stable notice code localizes the main copy even after backend copy edits
6838 PASS workspace lease contention uses its stable localized notice code
6839 PASS cancelled turn history explains the model-context boundary
6840 PASS unapplied steer keeps the user's guidance while localizing the warning
6841 PASS session recovery fork localization uses its stable notice code
6842 PASS covered session adoption localization uses its stable notice code
6843 PASS session recovery depth-cap localization uses its stable notice code
6844 PASS an unknown notice code falls back to exact-text matching
6845 PASS a codeless unmatched notice keeps its raw text
6846 PASS a distant question jump uses the bounded 500-turn history window
6847 PASS the follow-up jump page reaches the requested turn without overfetching
6848 PASS ordinary automatic history loading keeps the standard page size
6849 PASS a distant jump uses the backend's bounded entry capacity
6850 PASS ordinary history loading keeps the default entry and byte budgets
6851 PASS recovery conflict notices stay silent in the live transcript
6852 PASS silent recovery notices do not consume sequence ids
6853 PASS ordinary repeated notices remain visible
6854 PASS background lifecycle notices stay silent in the live transcript
6855 PASS silent lifecycle notices do not consume sequence ids
6856 PASS user-triggered MCP failures remain visible
6857 PASS visible MCP failure keeps its text
6858 PASS recovery conflict notices stay silent when hydrating history
6859 PASS background lifecycle notices stay silent when hydrating history
6860 PASS silent history notices keep later item ids compact
6861 PASS silent history notices do not inflate the hydrated sequence
6862 PASS history notices preserve expandable detail text
6863 PASS history notices localize by stable code when the replayed record carries one
6864 PASS history restores persisted turn work duration
6865 PASS identical meta is unchanged
6866 PASS identical sessionGeneration is unchanged
6867 PASS sessionGeneration changes invalidate meta equality
6868 PASS collaboration mode changes invalidate meta equality
6869 PASS workspace path changes invalidate meta equality
6870 PASS git branch changes invalidate meta equality
6871 PASS image input capability changes invalidate meta equality
6872 PASS image-understanding fallback changes invalidate meta equality
6873 PASS canonical todo progress invalidates meta equality
6874 PASS equivalent empty canonical todo lists keep meta stable
6875 PASS identical dismissed todo batches keep meta stable
6876 PASS persisted todo dismissal changes invalidate meta equality
6877 PASS blank tab snapshot preserves explicit auto approval mode
6878 PASS blank tab snapshot does not silently resurrect yolo approval
6879 PASS optimistic tab metadata preserves canonical todos for the same session
6880 PASS optimistic metadata keeps session-sidecar todo dismissals
6881 PASS a session remount waits for the new sidecar dismissals
6882 PASS meta refresh applies canonical todo progress
6883 PASS session reset clears canonical todos from the previous session
6884 PASS session reset clears persisted todo dismissals from the previous session
6885 PASS authoritative empty canonical todos survive meta refresh
6886 PASS panel uses fresh Meta todos while the live todo_write event is delayed
6887 PASS panel switches to the live todo_write snapshot when its result preview arrives
6888 PASS provider-ordered terminal result upserts the preview instead of duplicating the card
6889 PASS message without turn_done leaves local runtime marked running
6890 PASS message without turn_done still belongs to an active turn
6891 PASS final message closes the live stream before turn_done
6892 PASS stale completed stream still reconciles missed turn_done
6893 PASS fresh completed stream waits before reconciling
6894 PASS optimistic send starts before turn_started arrives
6895 PASS optimistic send reconciles even when turn_started is missed
6896 PASS a delayed turn_started event keeps the backend turn start instead of restarting the timer
6897 PASS a rehydrated running tab restores the backend turn start instead of restarting the timer
6898 PASS a legacy turn_started event begins a new remote turn instead of reusing completed-turn timing
6899 PASS first reasoning delta records a reasoning start time
6900 PASS first answer token marks reasoning complete
6901 PASS first answer token records reasoning completion time
6902 PASS turn_done persists the live reasoning duration
6903 PASS turn_done persists the full turn wall-clock duration
6904 PASS final message records reasoning duration when no text delta arrived
6905 PASS final message records cumulative turn work duration before turn_done
6906 PASS final message still closes live reasoning state
6907 PASS approval prompt keeps the turn running
6908 PASS approval prompt marks pendingPrompt
6909 PASS approval prompt remains cancellable
6910 PASS approval_request starts tab-scoped prompt wait
6911 PASS cancel_requested clears approval prompt locally
6912 PASS cancel_requested clears pendingPrompt locally
6913 PASS cancel_requested marks cancelling
6914 PASS cancel_requested waits for backend turn_done before idling
6915 PASS cancel_requested closes the open prompt wait
6916 PASS cancel_requested accumulates closed wait into the turn
6917 PASS late approval after cancel_requested stays hidden
6918 PASS background jobs alone do not make the composer runstatus active
6919 PASS backend_status stores background job count
6920 PASS background jobs alone are not foreground-cancellable
6921 PASS missing cancellable does not promote background-only metadata
6922 PASS missing cancellable stays non-cancellable with background-only metadata
6923 PASS legacy running metadata remains foreground-running
6924 PASS pending prompts remain foreground-running
6925 PASS background jobs without cancellable are background-only
6926 PASS turn starts at t0
6927 PASS fresh turn has no wait accum
6928 PASS approval_request records wait start at event time
6929 PASS open wait counts while tab is backgrounded
6930 PASS clearApproval closes the open wait
6931 PASS clearApproval accumulates background wait into the turn
6932 PASS workDurationMs excludes user-wait including background wait
6933 PASS reset clears context used tokens
6934 PASS reset preserves context window
6935 PASS reset clears context session tokens
6936 PASS reset clears restored cache hit tokens
6937 PASS reset clears restored cache miss tokens
6938 PASS reset clears restored context session cost
6939 PASS reset clears restored session cost state
6940 PASS reset restores default session currency
6941 PASS executor usage outside a turn does not inflate session tokens
6942 PASS executor usage outside a turn does not refresh context used tokens
6943 PASS helper usage outside a turn does not inflate session tokens
6944 PASS helper usage outside a turn does not inflate session cost
6945 PASS classifier usage while send is running counts toward session tokens
6946 PASS classifier usage while send is running counts toward session cost
6947 PASS classifier usage while send is running does not refresh context used tokens
6948 PASS helper usage inside a turn still counts toward session tokens
6949 PASS helper usage inside a turn still counts toward session cost
6950 PASS helper usage inside a turn does not become displayed latest usage
6951 PASS planner usage inside a turn still counts toward session tokens
6952 PASS planner usage does not fill the single displayed usage slot
6953 PASS compaction usage does not overwrite displayed executor usage
6954 PASS compaction usage still contributes to session token totals
6955 PASS turn_done stamps the exact user with checkpoint turn zero
6956 PASS turn_done checkpoint assignment preserves runtime notices
6957 PASS runtime notices preserve expandable detail text
6958 PASS history page replace renders the latest window
6959 PASS legacy history page converts its zero-based cursor to the first absolute turn
6960 PASS history page records older availability
6961 PASS paged history hydrates its authoritative checkpoint turn
6962 PASS legacy history page preserves the absolute question turn
6963 PASS older history request marks loading
6964 PASS older history failures remain available to the retry UI
6965 PASS retrying older history clears the previous failure
6966 PASS older history prepends before the current window
6967 PASS older history keeps the current window
6968 PASS legacy prepend starts at absolute turn one
6969 PASS legacy prepend keeps the recent page's absolute turn
6970 PASS older history clears hasOlder when all pages are loaded
6971 PASS older history clears loading
6972 PASS todo-only readiness card shows at the gated turn
6973 PASS an all-complete todo list retracts the stale todo-only card
6974 PASS a card listing non-todo gaps survives todo completion
6975 PASS an incomplete todo list keeps the todo-only card
6976
6977 163 passed, 0 failed, 163 total
6978
6979 ▶ src/__tests__/use-controller-send-fallback.test.tsx
6980
6981 use controller send fallback
6982 PASS startup has no active tab when backend has no tabs
6983 PASS send fallback activates the backend-selected tab
6984 PASS send fallback reconciles backend runtime metadata
6985 PASS send fallback keeps the optimistic user turn
6986 PASS send fallback submits to the activated tab
6987 PASS Ask fixture starts without a local turn id
6988 PASS Ask answer resolves one authoritative ListTabs fallback
6989 PASS Ask answer uses the authoritative turn fence
6990 PASS Ask answer never falls back to the unfenced endpoint
6991 PASS successful exact answer clears the matching Ask without replay
6992 PASS failed exact answer propagates to AskCard
6993 PASS failed exact answer preserves the pending Ask
6994 PASS failed exact answer keeps the prompt gate active
6995 PASS failed Ask answer uses the active locale
6996 PASS colliding submit marks its optimistic bubble failed
6997 PASS colliding submit preserves the pending Ask
6998 PASS active backend snapshot keeps the composer blocked after rejection
6999 PASS active backend snapshot restores the prompt gate after rejection
7000 PASS active backend snapshot restores the authoritative turn id
7001 PASS authoritative idle snapshot releases a rejected submit
7002 PASS authoritative idle snapshot leaves no prompt gate
7003 PASS rejected submit retries failed ListTabs reads at every bounded delay
7004 PASS exhausted status reads leave the composer conservatively blocked
7005 PASS stale Ask submission expires the old card
7006 PASS baseline stores the backend sequence
7007 PASS first rejection settles to authoritative idle
7008 PASS same-sequence idle settles a new failed submit
7009 PASS same-sequence idle removes the stale Stop action
7010
7011 28 passed, 0 failed, 28 total
7012
7013 ▶ src/__tests__/use-controller-stale-turn-watchdog.test.tsx
7014
7015 stale turn watchdog
7016 PASS optimistic submit enters running state without any agent events
7017 PASS missing turn_started leaves no live turn evidence
7018 PASS optimistic submit arms the stale-turn watchdog
7019 PASS first quiet-period probe reconciles backend runtime state
7020 PASS a genuinely running backend remains running
7021 PASS still-running probe re-arms instead of stopping after one check
7022 PASS idle backend settles the spinner without switching tabs
7023 PASS watchdog hydrates the persisted missed answer
7024 PASS settled turn leaves no watchdog timer behind
7025
7026 9 passed, 0 failed, 9 total
7027
7028 ▶ src/__tests__/web-search-model-settings.test.tsx
7029 web search model settings passed
7030
7031 ▶ src/__tests__/windows-maximised-sync.test.tsx
7032 windows maximised sync: lifecycle gating, listener sync, generation fence and store ownership passed
7033
7034 ▶ src/__tests__/workspace-change-status.test.ts
7035
7036 workspace git status labels
7037 PASS ?? reads as untracked instead of leaking porcelain
7038 PASS unstaged modification
7039 PASS staged addition
7040 PASS deletion
7041 PASS rename
7042 PASS unmerged conflict
7043 PASS staged and unstaged modification
7044 PASS missing status renders nothing
7045 PASS blank status renders nothing
7046 PASS an unmapped code passes through rather than vanishing
7047 PASS DD is a merge conflict, not a plain deletion
7048 PASS AA is a merge conflict, not a plain addition
7049 PASS UD is a merge conflict
7050 PASS zh translates every git status label ()
7051 PASS zh-TW translates every git status label ()
7052
7053 15 passed, 0 failed, 15 total
7054
7055 ▶ src/__tests__/workspace-launcher-races.test.tsx
7056 PASS scoped branch races, stale checkout/create, serial polling, visibility and incomplete totals
7057
7058 ▶ src/__tests__/workspace-layout.test.ts
7059
7060 workspace dock layout
7061 PASS the workspace toggle is a bar action button, not a fixed overlay the bar must dodge
7062 PASS right-dock tabs keep their content width instead of stretching to fill the strip
7063 PASS 1280px viewport leaves room for an expanded-sidebar dock
7064 PASS expanded-sidebar preview clamps to available width instead of overflowing
7065 PASS collapsed sidebar restores workspace room
7066 PASS wide-enough collapsed layout keeps the preferred preview width
7067 PASS very narrow viewports may leave less than the nominal dock minimum
7068 PASS very narrow dock still stays inside the viewport
7069 PASS ARIA minimum follows constrained rendered width
7070 PASS closed panel preserves the saved preferred width
7071 PASS maximized panel preserves the saved preferred width
7072 PASS live dock drag clamps the hard minimum to the available dock width
7073 PASS live sidebar drag recomputes dock width from the dragged sidebar width
7074 PASS terminal maximum follows half of the current viewport height
7075 PASS terminal maximum never falls below the accessible minimum
7076 PASS restored terminal height clamps after the window shrinks
7077 PASS terminal height clamps to its minimum
7078 PASS workspace resize hit area starts at the dock boundary and never overlaps the chat scrollbar gutter
7079 PASS terminal drawer stays visible on narrow viewports
7080 PASS terminal-drawer-open layout keeps the shell bar's row and reserves one for the status bar below the terminal drawer
7081 PASS the dock keeps a zero-width third track while closed so opening and closing it interpolates
7082 PASS narrow viewport keeps the resizer and drawer in the content column above the status bar
7083 PASS terminal drawer has a top border only when expanded, avoiding a collapsed artifact line
7084 PASS workbench sidebar does not reserve the docked status bar twice
7085 PASS topic bar establishes a raised stacking context for external-opener menus
7086 PASS composer mode controls keep spacing and icon baselines stable on hover
7087 PASS creation style collapses the status bar row so the terminal drawer sits directly below the chat pane
7088 PASS the single terminal session keeps a visible close control
7089 PASS terminal panel refreshes changed capability while reusing an in-flight first-open request
7090 PASS rapid tab switches cannot paint the previous tab's terminal or selection action
7091 PASS terminal tab strip does not duplicate the header's new-session action
7092 PASS terminal header renders the backend-approved shell options
7093 PASS new terminal sessions use the selected shell
7094 PASS new terminal sessions are not hard-coded to the default shell
7095 PASS pointer and keyboard intent prefetch the terminal chunk before opening from the topic bar
7096 PASS the warm terminal pauses PTY output while collapsed and resumes from its output cursor
7097 PASS terminal selection-to-chat exposes the shared configurable shortcut
7098 PASS C1: dock width never consumes the chat 400px floor (chat stays readable)
7099 PASS C1: wider viewport gives the dock more room, chat floor untouched
7100
7101 39 passed, 0 failed, 39 total
7102
7103 ▶ src/__tests__/workspace-panel-commands.test.tsx
7104 workspace commands: scoped restoration, Creation, preview/maximize, remote requests and synchronous disposal passed
7105
7106 ▶ src/__tests__/workspace-panel-open-migration.test.ts
7107
7108 workspace dock-open legacy key migration (CLAIM.PERSIST.014)
7109 PASS project key missing + legacy global closed => stays closed
7110 PASS project key missing + legacy global open => stays open
7111 PASS project key present wins over legacy global
7112 PASS neither key present => default open
7113
7114 workspace dock-open migration: 4 passed, 0 failed
7115
7116 ▶ src/__tests__/workspace-panel-swr-contract.test.ts
7117 PASS workspace panel SWR and per-project restoration contract
7118
7119 ▶ src/__tests__/workspace-path-copy.test.tsx
7120
7121 workspace path copy menu
7122 PASS builds both path-copy actions
7123 PASS exposes the localized relative-path label
7124 PASS exposes the localized absolute-path label
7125 PASS folder relative paths omit the tree-only trailing slash
7126 PASS relative-path selection closes the menu
7127 PASS absolute-path selection uses backend resolution
7128 PASS copies the backend-resolved absolute path
7129 PASS drops stale absolute-path results after the workspace scope changes
7130
7131 8 passed, 0 failed, 8 total
7132
7133 ▶ src/__tests__/workspace-split.test.ts
7134
7135 workspace file split
7136 PASS first split divides the file area evenly (no tree rail to reserve)
7137 PASS tree width is clamped so the preview keeps its minimum width
7138 PASS tree resize pointer coordinates start at the panel's left edge
7139 PASS tree resize pointer clamps against the preview minimum
7140 PASS right-side tree width is measured from the pointer to the panel's right edge
7141 PASS right-side tree maximum keeps space for the preview
7142 PASS default split recomputes evenly after the parent preview width applies
7143 PASS manual split width is preserved when the parent width changes
7144 PASS outer file area can still shrink below split target width
7145 PASS file tree collapses before tree and preview would overflow a narrow panel
7146 PASS file tree remains available at the exact split minimum width
7147 PASS file tree stays visible until the measured panel width is known
7148 PASS closing the current preview falls back to the previous recent file
7149 PASS closing one preview preserves the other recent files
7150 PASS opening the first preview initializes an even file split
7151 PASS switching files while preview and tree are visible preserves the manual split
7152 PASS revealing the hidden tree initializes an even file split
7153 PASS entering manual resize from even split keeps the currently rendered tree width
7154 PASS pending file reveal scrolls once the selected row is present
7155 PASS manual folder changes do not re-scroll to the previous selected file
7156 PASS pending file reveal waits until async directory loading exposes the row
7157 PASS workspace filter merges backend deep search results without duplicating loaded rows
7158 PASS workspace filter normalizes directory search results to tree row paths
7159
7160 23 passed, 0 failed
7161
7162 ▶ src/__tests__/workspace-tree-memory.test.ts
7163
7164 versioned per-project workspace memory
7165 PASS restores the file selection independently
7166 PASS restores the change selection independently
7167 PASS restores expanded directories and tree scroll
7168 PASS restores both outer dock widths
7169 PASS keeps project state isolated by key
7170 PASS writes an explicit schema version
7171 PASS keeps high-frequency scroll updates off the synchronous storage path
7172 PASS updates the in-memory scroll position immediately
7173 PASS coalesces 120 scroll updates into one durable write
7174 PASS allows at most one persistence scheduling frame
7175 PASS waits for the quiet-period timer after the frame
7176 PASS persists the final project once after the quiet period
7177 PASS flushes pending state before a scope or page exit
7178 PASS safely ignores storage from an unsupported future schema
7179 PASS a corrupt cache cannot prevent workspace startup
7180
7181 15 passed, 0 failed, 15 total
7182
7183 ▶ src/__tests__/workspace-tree-scroll-restore.test.tsx
7184
7185 workspace tree scroll restore (CLAIM.TREE.008)
7186 PASS fixture has a real scrollable extent
7187 PASS initial mount restores the persisted DOM scroll offset
7188 PASS restoration preserves the persisted localStorage offset
7189 PASS persisted scroll offset survives remount in localStorage
7190 PASS tree rows re-render after remount (got 23)
7191 PASS dock-tab remount restores the actual DOM scroll offset
7192 PASS files and changed view tabs render in the fixture
7193 PASS tree rows re-render after files<->changed view switch
7194 PASS view restores its own DOM offset 160
7195 PASS view restores its own DOM offset 420
7196 PASS view restores its own DOM offset 160
7197 PASS view offset survives storage reload
7198
7199 workspace tree scroll restore: 12 passed, 0 failed
7200
7201 ▶ src/__tests__/workspace-turn-verification.test.tsx
7202
7203 workspace turn verification
7204 PASS workspace overview does not imply the current turn covers all changes
7205 PASS actual exit code appears with the historical command
7206 PASS mutation receipts are not presented as a diff inventory
7207 PASS later changes mark checks stale
7208 PASS result panel has only view actions
7209 PASS session switch immediately fences a historical request
7210 PASS historical counts come from the frozen receipt
7211 PASS a current summary refresh preserves the selected historical result
7212 PASS a new turn fences the old reveal
7213 PASS old session response cannot enable the new session file list
7214 PASS late diff response is discarded after session replacement
7215 PASS late log response is discarded after session replacement
7216 PASS cleared logs remain explicitly unavailable
7217
7218 13 passed, 0 failed
7219
7220 ▶ src/__tests__/workspace-view-memory.test.ts
7221 PASS per-view navigation, project history/geometry, restart and legacy/future compatibility
7222
7223 ▶ src/__tests__/worktree-merge-commands.test.tsx
7224 worktree merge commands: overlay state, receipt gate, intent fences and close/finalize chain passed
7225
7226 ▶ src/__tests__/worktree-merge-lifecycle.test.ts
7227 worktree merge lifecycle tests passed
7228
7229 ▶ src/__tests__/write-access-decision.test.tsx
7230 PASS write-access card uses the directory-expansion title
7231 PASS write-access card lists friendly directories
7232 PASS write-access card shows justification
7233 PASS home grant shows the high-risk warning
7234 PASS merged Ask permission is explained
7235 PASS write-access approval has four options: expected 4, got 4
7236 PASS first option is allow once
7237 PASS second option is session grant
7238 PASS third option persists to the project
7239 PASS fourth option is deny
7240 PASS clicking session only selects: expected 0, got 0
7241 PASS write-access confirm submits once: expected 1, got 1
7242 PASS session maps to (true,true,false): expected "[true,true,false]", got "[true,true,false]"
7243
7244 run-tests: all 337 suites passed
7245
7245 lines Plain Text