| 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 |