Repository navigation
Redesign the context views with a tile grid - #555
Conversation
The Quick View Context card, the composer meter and its popover, and the Context tool now share one visual: 100 tiles over the whole context window, each 1% of it, colored by category, then free space and the hatched response reserve. Categories get their own bars, the composer and Quick View summary use a 10-pip meter, and compaction state is a soft status pill. The Context tool groups Next request, Session and Recorded usage into cards with a cache-share usage bar. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
The composer popover now warns from the approaching phase, matching its pips and Quick View. The cache share counts cache writes as prompt input. Category rows show % of window again, both layouts show used of usable with the estimate marker, the caption and popover state the window size, the deferred-tools sentence is back, a small reserve keeps one tile, and pills use the control radius. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
Hermes Review BotConfidence: 5 Engine: SummaryRedesigns Aiden's context pressure presentation across the Quick View card, the composer meter, and the sidebar Context tool around a shared 100-tile grid and a 10-pip meter. Next-request projections allocate 100 tiles (1% of the model window each) by largest remainder across static and message categories, quiet free space, and response reserve, and the composer meter illuminates pips per 10% of usable budget with amber warning cues at 80%. A new prompt cache timer tracks documented fixed idle lifetimes (Claude, Bedrock, OpenAI/Azure GPT-5.6+, Kimi K3, MiniMax M2, and GitHub Copilot) based on the latest cache-active assistant turn and cache-warming refreshes. Maintainers should double-check that the newly documented model lifetime heuristics in Confidence Score: 5/5Fully traced and verified across main process projections, IPC notifications, cache-warming callbacks, renderer components, accessibility markup, and test suites. 📁 Important Files Changed
FindingsNo findings. Sequence DiagramsequenceDiagram
participant LLM as Provider / LLM Stream
participant Warmer as PiCacheWarmer
participant Client as llmClient / Main
participant Ctx as GenerationContext
participant UI as Renderer (ContextBreakdown)
Note over Client,UI: Live Generation & Cache Window Initialization
Client->>Ctx: createGenerationHarness (promptCacheTtlMs)
Client->>UI: chat:context-pressure (lastRequestAt = Date.now())
UI->>UI: PromptCacheTimer starts countdown
Note over Warmer,UI: Cache Warming Extension
Warmer->>LLM: streamSimple (maxTokens: 1)
LLM-->>Warmer: message (cacheRead > 0)
Warmer->>Client: onCacheRefreshed(dispatchedAt)
Client->>Client: rememberPromptCacheRefresh(chatId, refresh)
Client->>UI: chat:context-pressure (lastRequestAt = dispatchedAt)
UI->>UI: PromptCacheTimer resets expiry
Note over Client,UI: Ambient Read After Stop / Idle
UI->>Client: chats:contextPressure (chatId)
Client->>Ctx: promptCacheWindow(model, messages, refresh)
Ctx-->>Client: { ttlMs, lastRequestAt }
Client-->>UI: ChatContextPressureV1 with promptCache
[]
|
There was a problem hiding this comment.
Important
The composer popover clips token values at the supported 18px UI font size. The inline finding includes a browser reproduction and screenshot.
Reviewed changes across the shared context visuals, Quick View, composer popover, Context tool, tests, and accompanying documentation.
- Shared tiles and pips: Reviewed whole-window tile allocation, category ordering, provider-counted excess, response reserves, and usable-input pip counts.
- Context breakdown: Reviewed category bars, percentages, deferred-tool disclosure, compaction status, and the new panel layout.
- Composer popover: Reviewed warning parity, token details, accessible labels, and rendered layout across supported font sizes.
- Session and usage cards: Reviewed session metadata, retained usage aggregation, the cache-share calculation, and the usage chart.
- Tests and docs: Reviewed updated behavioral coverage and the descriptions in project memory and the UI guide.
Validation: 71 focused tests passed, as did TypeScript checking and ESLint on the changed TS/TSX files. Chromium checks used the actual components and app CSS, including light/dark mode and 12–18px fonts; full Electron E2E was not run locally on Linux.
gpt-6.1-sol | 𝕏
- Read ">999%" and explain a too-small window instead of promising compaction - Show "<1%" (with one pip lit) and "<0.1%" when nonzero context rounds to zero - Format billions in recorded usage and avoid "1000.0K" rounding - Collapse recorded usage to one line when the provider never reports it - Shorten the provider-excess legend label so it fits the narrow card Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
The popover width now scales with the UI font size, and each row can wrap its value below the term instead of clipping it. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
There was a problem hiding this comment.
ℹ️ No new issues found in this delta. The existing popover-clipping finding remains unresolved, so this review does not approve the PR.
Reviewed changes since the prior review at be50c33b, covering the provider and context-window edge cases added in c34f803a.
- Hardened small-window messaging to explain when the static prompt exceeds the usable budget instead of promising that compaction will help.
- Preserved tiny usage visibility with
<1%labels, a lit first pip for nonzero usage, and<0.1%category shares; capped extreme displayed percentages at>999%. - Shortened provider-counted excess to
Not itemizedthroughout the category rows and tile labels. - Simplified missing usage reports to one explanatory message and stopped the Next request card from stretching to the adjacent column's height.
- Improved token formatting at rounding boundaries and added billion-token cumulative totals, with extended rendering and formatting tests.
Validation: 85 focused tests passed, along with npx tsc --noEmit and ESLint on the changed TS/TSX files. Browser layout checks were not repeated; full Electron E2E was not run on Linux.
gpt-6.1-sol | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes since c34f803a, focused on the composer popover's large-font clipping fix in 99736b26.
- Expanded popover sizing with the UI font size while retaining a viewport-width cap.
- Enabled token-row wrapping so values remain readable when the available width cannot accommodate both the term and value on one line.
Validation: all 40 focused context and Quick View tests passed, along with npx tsc --noEmit and scoped ESLint. Chromium containment assertions using the actual components and app CSS passed at every UI font size from 12–18px, in light and dark modes, at 1280px, 800px, and 320px viewport widths. The previously reported clipping is fixed; its thread was already resolved. Full Electron E2E was not run on Linux.
gpt-6.1-sol | 𝕏
|
Desktop tests (core-git) failed on 99736b2 with 2 failures out of 3,618 tests (macOS). I don't think this PR caused it. The PR only changes renderer context components and their tests, and none of those files are in the core-git lane, which covers main-process services, git, worktrees and scripts. The lane passed in the unit job on be50c33, and the code it covers hasn't changed since. I'll re-run the failed job once when the workflow finishes, and record the failing tests here if it fails again. Generated by Claude Code |
Projections now carry the provider's prompt cache window when the model declares a cache lifetime and a request has used the cache. Quick View and the Context tool count it down and say when it has lapsed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
There was a problem hiding this comment.
Important
The new countdown can report an expired cache after a successful cache-warming request.
Reviewed changes since the prior review at 99736b26, focused on the prompt-cache countdown added in ad2808e8.
- Added cache-window metadata derived from model lifetimes and cached assistant requests, plus live projection timestamps.
- Added countdown displays to Quick View and the Context tool, with a draining bar, last-minute warning, and expired state.
- Extended parsing, tests, and documentation for optional cache windows and countdown rendering.
Validation: 89 context and Quick View tests plus 15 cache-warming tests passed. TypeScript checking and scoped ESLint passed. Browser layout checks and full Electron E2E were not repeated.
gpt-6.1-sol | 𝕏
very-hermes-bot
left a comment
There was a problem hiding this comment.
Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.
| React.useEffect(() => { | ||
| // Ticks against the wall clock until the cache lapses; nothing else drives this. | ||
| if (expiresAt <= Date.now()) return; | ||
| const timer = window.setInterval(() => setNow(Date.now()), 1000); | ||
| return () => window.clearInterval(timer); | ||
| }, [expiresAt]); |
There was a problem hiding this comment.
[P1 · logic] Prompt cache countdown interval runs indefinitely after expiration
Confidence: 0.95
The interval created in useEffect is only prevented from starting if expiresAt has already passed upon setup, but once running, it never clears itself when current >= expiresAt, causing 1Hz state updates and component re-renders indefinitely on expired caches.
Repair: Check if current >= expiresAt within the interval callback and call window.clearInterval(timer) to stop ticking.
There was a problem hiding this comment.
Fixed in b307062: the interval now clears itself on the tick that reaches expiry.
Generated by Claude Code
The countdown now covers Claude through Anthropic markers or Bedrock, Bedrock Nova, OpenAI and Azure GPT-5.6 and later, Kimi, MiniMax and GitHub Copilot, from a sourced table used after the catalog's own lifetime. Providers that only publish a range or nothing keep showing no timer. Also addresses review: a successful cache-warming refresh re-sends the live window from its dispatch, and the countdown interval stops once it expires. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
There was a problem hiding this comment.
Important
The new test registration blocks CI lane execution, and several provider lifetimes do not support the exact expiry shown by the countdown.
Reviewed changes since ad2808e8, focused on the provider lifetime resolver and cache-timer fixes in b3070626.
- Added provider-specific lifetimes with catalog precedence, model/API checks, and catalog-backed tests.
- Connected successful warming refreshes to live pressure notifications using the warming request's dispatch timestamp.
- Stopped countdown intervals at expiry and added hour-based formatting for longer cache windows.
- Updated test scripts and documentation for the expanded provider coverage.
Validation: 111 focused tests passed; TypeScript checking and scoped ESLint passed. CI registry validation failed 5 of 15 tests because main/services/prompt-cache-lifetimes.test.ts is unassigned. Primary provider documentation was checked; browser layout checks and Electron E2E were not repeated.
gpt-6.1-sol | 𝕏
| if ((model.provider === "minimax" || model.provider === "minimax-cn") && model.api === "anthropic-messages") { | ||
| return 5 * MINUTE; | ||
| } | ||
| if (model.provider === "moonshotai" || model.provider === "moonshotai-cn") return 5 * MINUTE; |
There was a problem hiding this comment.
[P2] Avoid five-minute expiry without a matching provider contract
The cited MiniMax documentation gives no cache lifetime, while the cited Kimi page documents the five-minute cache-write policy for kimi-k3, not the shipped K2.6/K2.7 entries. These branches nevertheless give those models a precise five-minute countdown followed by Expired, contrary to the stated policy of omitting undocumented lifetimes.
Technical details
# Unsupported five-minute provider fallbacks
## Affected sites
- `main/services/prompt-cache-lifetimes.ts:51-54` assigns five minutes across MiniMax and Moonshot provider families.
- `main/services/prompt-cache-lifetimes.test.ts:61-67` expects that duration for all shipped entries rather than distinguishing documented model policies.
- `renderer/components/context-breakdown.tsx:176-188` presents the value as remaining lifetime and then asserts expiration and rebuilding.
## Evidence
- https://platform.minimax.io/docs/api-reference/text-prompt-caching documents automatic prefix caching, usage fields, and minimum input size, but no five-minute TTL or renewal guarantee.
- https://platform.kimi.ai/docs/guide/use-context-caching-feature-of-kimi-api describes the 5m/1h cache-write policy for `kimi-k3` and explicitly says K2.6/K2.7 do not support Cache Write. The shipped Moonshot entries are K2.6/K2.7; that page does not establish their fixed idle lifetime.
## Required outcome
- Return a nonzero fallback only for models with a documented matching idle lifetime; otherwise omit the countdown.
- Align tests and provider-coverage documentation with the supported model policies.There was a problem hiding this comment.
Narrowed in 016ef0b.
- Kimi: only
kimi-k3gets the 5 min timer. The page says K2.6 and K2.7 don't write caches. - MiniMax: M2-series models get 5 min. The page's Explicit Prompt Caching column says "5-minute expiration, automatically renewed with continued use" for those models. That is the mode Pi's
cache_controlmarkers on the Anthropic endpoint request. M3 only has automatic caching, which "varies with load", so it gets no timer.
Tests cover each model on both sides of the rule.
Generated by Claude Code
There was a problem hiding this comment.
The Kimi restriction is addressed, but the current MiniMax page still documents only automatic caching with no five-minute TTL or renewal guarantee, so the MiniMax part remains open.
gpt-6.1-sol | 𝕏
There was a problem hiding this comment.
This rule stays as it is. I fetched that page again today, and it has a comparison table with two columns. The "Prompt Caching (Passive)" column says "Expiration time automatically adjusted based on system load" for M3, M2.7, M2.5 and M2.1. The "Explicit Prompt Caching" column, for the M2.7, M2.5, M2.1 and M2 series, says "5-minute expiration, automatically renewed with continued use".
Pi sends cache_control markers to MiniMax's Anthropic endpoint, so M2-series requests use explicit caching. M3 is listed only under passive caching, so it gets no timer. If the table loads differently depending on locale or tab, the timer only shows when the request actually reads or writes the cache. That keeps the risk to an early "Expired".
Generated by Claude Code
very-hermes-bot
left a comment
There was a problem hiding this comment.
Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.
| const [now, setNow] = React.useState(() => initialNow ?? Date.now()); | ||
| const remaining = Math.max(0, Math.min(cache.ttlMs, expiresAt - now)); | ||
| React.useEffect(() => { | ||
| // Ticks against the wall clock until the cache lapses; nothing else drives this. | ||
| if (expiresAt <= Date.now()) return; | ||
| const timer = window.setInterval(() => { | ||
| const current = Date.now(); | ||
| setNow(current); | ||
| if (current >= expiresAt) window.clearInterval(timer); | ||
| }, 1000); | ||
| return () => window.clearInterval(timer); | ||
| }, [expiresAt]); |
There was a problem hiding this comment.
[P1 · logic] Stale state in PromptCacheTimer causes expired prompt caches to display as active indefinitely
Confidence: 0.95
Storing now in React state leaves it frozen after expiry or mount, causing an already-expired cache with expiresAt > now to compute a positive remaining time and display an active bar while the effect returns early without scheduling any interval to update it.
Repair: Compute now on each render from initialNow ?? Date.now() and drive 1-second re-renders using a tick counter in state until Date.now() >= expiresAt.
There was a problem hiding this comment.
Fixed in 016ef0b. When expiresAt changes, the effect now reads the clock again before deciding whether to tick, so a window that is already lapsed shows "Expired" straight away. initialNow pins the clock for static renders only.
Generated by Claude Code
Stopping during a tool wait after a warm settles without another foreground request, so ambient reads now remember the chat's latest warming refresh. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
…models Assigns prompt-cache-lifetimes.test.ts to a CI lane, limits the Kimi timer to K3 and the MiniMax timer to M2-series explicit caching, says the next request may need to rebuild an expired cache since lifetimes are guarantees, and re-reads the clock when a new cache window arrives. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
There was a problem hiding this comment.
ℹ️ No new issues found in this delta. The earlier CI-registry and provider-lifetime findings remain open, so this is not an approval.
Reviewed changes since the prior review at b3070626, focused on retaining cache-warming expiry through the transition from a stopped generation to ambient context projections.
- Retained warming timestamps per chat and passed them into ambient cache-window reconstruction, with cleanup when the chat context is released.
- Selected the newer matching refresh without overriding newer transcript usage or applying another model's timestamp.
- Extended behavioral coverage and project memory for later, older, and other-model refreshes.
Validation: all 111 focused tests passed, along with npx tsc --noEmit and scoped ESLint. The CI registry suite still fails 5 of 15 tests with CI registry/source mismatch; unassigned=["main/services/prompt-cache-lifetimes.test.ts"], not-in-source=[], matching the existing finding. Browser layout checks and Electron E2E were not repeated.
gpt-6.1-sol | 𝕏
very-hermes-bot
left a comment
There was a problem hiding this comment.
Inline review — 1 finding(s) anchored to the diff. See the pinned summary comment for the overview.
| const [now, setNow] = React.useState(() => initialNow ?? Date.now()); | ||
| const remaining = Math.max(0, Math.min(cache.ttlMs, expiresAt - now)); | ||
| React.useEffect(() => { | ||
| // Ticks against the wall clock until the cache lapses; nothing else drives this. | ||
| if (expiresAt <= Date.now()) return; | ||
| const timer = window.setInterval(() => { | ||
| const current = Date.now(); | ||
| setNow(current); | ||
| if (current >= expiresAt) window.clearInterval(timer); | ||
| }, 1000); | ||
| return () => window.clearInterval(timer); | ||
| }, [expiresAt]); |
There was a problem hiding this comment.
[P1 · logic] PromptCacheTimer retains stale now state across prop updates, causing expired caches to display as active
Confidence: 0.95
PromptCacheTimer stores now in useState and stops ticking upon expiration, so subsequent prop changes with an already-expired cache retain the stale now timestamp and render full remaining TTL indefinitely.
Repair: Evaluate now dynamically during render from initialNow ?? Date.now() and use a tick counter in useEffect to drive re-renders only while active.
There was a problem hiding this comment.
This finding was raised against 22b844b. It is already fixed in 016ef0b: the effect re-reads the clock whenever expiresAt changes, before it decides whether to tick, so a window that arrives already lapsed renders "Expired".
Generated by Claude Code
There was a problem hiding this comment.
ℹ️ No new issues found in this delta. Two previously reported cache-lifetime concerns remain unresolved, so this is not an approval.
Reviewed changes since 22b844b2, focused on the lifetime restrictions, timer updates, and CI registration in 016ef0bf.
- Narrowed provider fallback coverage to Kimi K3 and MiniMax M2-series models, with catalog-backed tests and corresponding documentation updates.
- Refreshed the countdown clock when a new cache window arrives, including already-expired windows, and kept an explicit test clock deterministic.
- Softened post-countdown wording so it no longer promises that the next request rebuilds the cache.
- Assigned the lifetime test suite to a CI lane, fixing the registry validation failure.
Validation: all 111 focused context/cache tests and all 15 CI registry tests passed. Two additional temporary component checks passed for expired-window replacement, interval cleanup, and refresh after expiry. TypeScript checking and scoped ESLint passed. Primary provider documentation was rechecked; browser layout checks and Electron E2E were not repeated.
gpt-6.1-sol | 𝕏
Provider lifetimes are guarantees, so the end of the countdown means the cache may be gone rather than certainly gone. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
There was a problem hiding this comment.
ℹ️ No new issues found in this delta. The earlier MiniMax lifetime finding remains open, so this is not an approval.
Reviewed changes since 016ef0bf, focused on the cache-status wording in 1c9c9505.
- Changed lapsed-cache messaging from
ExpiredtoLikely expired, retaining the conditional rebuild caption instead of asserting that the cache is gone. - Updated rendering coverage to expect the qualified status in the shared context breakdown.
Validation: all 30 focused context-rendering tests passed, and ESLint passed for both changed files. Browser layout checks, TypeScript checking, and Electron E2E were not repeated for this wording-only delta.
gpt-6.1-sol | 𝕏
There was a problem hiding this comment.
ℹ️ No new issues found in this delta. The previously reported MiniMax lifetime concern remains open, so this is not an approval.
Reviewed changes since 016ef0bf, focused on the lapsed-cache wording update in 1c9c9505.
- Replaced the unconditional expiry label with
Likely expired, retaining the conditional rebuild caption in both context views. - Updated the rendering assertion to cover the revised lapsed-cache state.
Validation: all 30 focused context rendering tests passed, and ESLint passed for the changed component and test. Browser layout checks and Electron E2E were not repeated for this wording-only change.
gpt-6.1-sol | 𝕏
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7
There was a problem hiding this comment.
ℹ️ No new issues found in this delta. The previously reported MiniMax lifetime concern remains open, so this is not an approval.
Reviewed changes since 1c9c9505, focused on the integration of main in merge commit 3fb2a6c0.
- Merged the serial test chain with
main, retaining itstest:workspace-artifactscommand. - Preserved cache-lifetime test registration in the serial, compaction, coverage, and CI registry paths. The incremental diff contains no PR feature-code changes.
Validation: all 82 workspace-artifact tests and all 15 CI-registry tests passed. The script reconciliation removed no existing commands. Context rendering, browser layout, TypeScript, and Electron E2E checks were not repeated for this merge-only delta.
gpt-6.1-sol | 𝕏

Requested by sbt · project thread
Before: the Quick View Context card used a thin stacked bar, which at low usage became a row of colored slivers, followed by a dense legend table. The composer meter was a gauge icon with a popover listing text rows. The Context tool repeated those rows and added plain lists for Session and Recorded usage.
After: the three surfaces share one visual, picked from the mockups as option C, "Tiles". There are 100 tiles, each 1% of the model's context window. Used tiles are colored by category, followed by free space, with the hatched response reserve at the end.
How:
renderer/components/context-tiles.tsxholds the shared pieces.contextTiles()allocates the 100 tiles by largest remainder. Any used context or reserve always gets at least one tile, and an over-budget projection takes tiles from the reserve.ContextTilesrenders arole="img"whose label names every segment, andContextPipsdraws the pips.ContextBreakdowngainslayout="panel"for the Context tool. All colors come from the existing--chart-*and status tokens, so light, dark and the theme presets all work. Every number still comes from the main-process projection; nothing is re-estimated in the renderer.Cache timer:
ChatContextPressureV1gains an optionalpromptCachefield ({ ttlMs, lastRequestAt }). The parser drops a malformed value without losing the projection.lastRequestAtfrom the newest assistant response on the same provider and model that read or wrote the cache (promptCacheWindowingeneration-context.ts). They also use a later cache-warming refresh, which is remembered per chat (rememberPromptCacheRefresh), so stopping during a tool wait keeps the right expiry.llm-client.tsuse the moment each request is prepared. A successful warming refresh re-sends the window from its dispatch time.The lifetime comes from
promptCacheTtlMsinmain/services/prompt-cache-lifetimes.ts. It uses the catalog'spromptCache.shortfirst, which matches Aiden's default "short" retention. Otherwise it uses a sourced table of providers that publish a fixed idle lifetime that each cache read restarts (docs checked 2026-10-19). These lifetimes are guarantees, so a cache can outlive the countdown.These get no timer, because their docs give only a range or nothing:
Cache warming still uses only the catalog's lifetime.
A review subagent checked the first commit. The second commit fixes what it found:
Edge cases across providers (third commit)
Every case was rendered with the real components from projections shaped like each provider's. Light and dark screenshots are on the edge-case page, which is private to the owner.
These already behaved well: over budget at 128K, Claude at 1M, approaching the limit with estimates, compacting, local 8K without a breakdown, a large response reserve, and the narrow Context tab.
The fourth commit fixes a Pullfrog finding. At the 18px UI font size, the composer popover clipped token values. The popover width now scales with
--ui-font-size, and each row can wrap its value instead of clipping it. Pullfrog re-checked fonts from 12–18px and confirmed the fix.Later commits add the per-provider lifetimes and fix review findings from Pullfrog and Hermes:
Not changed, noted for later:
--chart-7.Tests:
context-breakdown.test.tsx,context-meter.test.tsx,context-pressure.test.ts,generation-context.test.tsandpi-cache-warming.test.tsare updated and extended.prompt-cache-lifetimes.test.tsis new and registered inpackage.jsonandscripts/ci-test-registry.json.Locally, the touched suites,
test:model-catalogandci-test-registry.test.mjspass, andtscand eslint are clean. The e2e selectors (Context usage,…, "Recorded usage", "Send a message") are unchanged.Flaky test record: Desktop tests (core-git) on macOS failed with 2 of 3,618 tests on 99736b2 (run) and passed on one re-run. On that commit the PR touched no code in that lane, which covers main-process git, worktree and service code. I couldn't name the two specs because the log tool only returns the last 5,000 lines. The b307062 lane failures were the unregistered suite, not flakes.
Docs: the Context row in
docs/chatgpt-desktop-ui-inspiration.mdand.memory/quick-view-cards.mdare updated.🤖 Generated with Claude Code
https://claude.ai/code/session_0192A2sztMG1oG9N6WJuYSX7