Session: agent-a0323c-subagent-a0323c99 — 2026-04-29

workspace-doctolib · Claude · branch HEAD · claude-sonnet-4-6 · 2026-04-29 07:17 · 1 msgs · 26 tools · 14 min read · updated 8 days ago

Analyze the test coverage of the following GitHub PR:

tools: ToolSearch, mcp__plugin_github_github__pull_request_read, Bash, Read
← workspace-doctolib Download .md .txt .json
Tool calls
Read Read: 12 calls (46.2%) 12 Bash Bash: 9 calls (34.6%) 9 mcp__plugin_github_github__… mcp__plugin_github_github__pull_request_read: 3 calls (11.5%) 3 ToolSearch ToolSearch: 2 calls (7.7%) 2
Token usage1.3M total
Input52
Cache creation115.8K
Cache read1.2M
Output6.8K
Cache hit ratio91%· healthy

Project: workspace-doctolib · Branch: HEAD · Mode: ` · **Model:**claude-sonnet-4-6`

Stats: 1 user messages, 26 tool calls, tools used: ToolSearch, mcp__plugin_github_github__pull_request_read, Bash, Read.

Conversation

Turn 1 — User

Analyze the test coverage of the following GitHub PR:

PR URL: https://github.com/doctolib/doctolib/pull/241133 Repo: doctolib/doctolib

Use the GitHub MCP tools to read the PR diff. If you need to browse local code for context, the local worktree is at /Users/USER/workspace/doctolib/worktrees/doctolib/ (check subdirectories for the relevant branch).

Assess: - Whether new functionality has adequate test coverage - Missing edge case tests - Quality of existing tests added in this PR

Return a structured list of findings with file paths and line numbers.

Turn 1 — Assistant

I'll analyze the test coverage of the PR by examining the diff and related code.

Tools used:

  • ToolSearch (inputs: query, max_results)

Tool results:

→ result (ok)

I'll fetch the PR details and diff to analyze the test coverage.

Tools used:

  • ToolSearch (inputs: query, max_results)

Tool results:

→ result (ok)

Let me fetch the PR details and files in parallel.

Tools used:

  • mcp__plugin_github_github__pull_request_read (inputs: method, owner, repo, pullNumber)

Tool results:

→ result (ERROR): failed to get pull request: GET https://api.github.com/repos/doctolib/doctolib/pulls/241133: 404 Not Found []

Tools used:

  • mcp__plugin_github_github__pull_request_read (inputs: method, owner, repo, pullNumber, perPage)

Tool results:

→ result (ERROR): failed to get pull request files: GET https://api.github.com/repos/doctolib/doctolib/pulls/241133/files?page=1&per_page=100: 404 Not Found []

The PR API returned 404, which likely means it's in a private repository requiring different auth, or the PR number is incorrect. Let me try the diff and also check the local worktree.

Tools used:

  • Bash: ls /Users/USER/workspace/doctolib/worktrees/doctolib/

Tools used:

  • mcp__plugin_github_github__pull_request_read (inputs: method, owner, repo, pullNumber)

Tool results:

→ result (ok): fhir-2089 FHIR-2091-nhr-document-list-pagination FHIR-2166-fix-nhr-mock-status-visibility fhir-2169 fhir-2181 fhir-2189_class-code-label-map fhir-2190_improve-filter-panel-ui fhir-2209_fix-patient-ins-env-transformation fhir-2216_fix-nhr-date-columns-and-document-type fhir-2221_display-last-dmp-access-date fhir-2222_add-visible-to-all-filter fhir-2223_fix-column-widths-dmp FHIR-2224

Tool results:

→ result (ERROR): failed to get pull request diff: GET https://api.github.com/repos/doctolib/doctolib/pulls/241133: 404 Not Found []

The GitHub API is returning 404 for the PR — likely this is a private repository and the GH token doesn't have access to it. Let me try using the local git CLI, which may have the credentials needed.

Tools used:

  • Bash: cd /Users/USER/workspace/doctolib/doctolib && gh pr view 241133 --json title,headRefName,baseRefName,body 2>&1 | head -60

Tool results:

→ result (ok): {"baseRefName":"master","body":"## Why\n\nhttps://doctolib.atlassian.net/browse/FHIR-2224\n\nupdateDocumentStatus in DmpApi previously returned Promise<void> and threw on failure. Callers had no way to access structured DMP error information (error codes, descriptions) — they could only catch a plain Error with a message string. This PR makes the API return structured results, consistent with how search() returns SearchResult with an optional error: DmpApiErrorInfo.\n\n## How\n\n** …(truncated, 2794 more chars)

Tools used:

  • Bash: cd /Users/USER/workspace/doctolib/doctolib && gh pr diff 241133 2>&1

Tool results:

→ result (ok): diff --git a/packages/@doctolib/dmp/src/business/DmpApi.test.ts b/packages/@doctolib/dmp/src/business/DmpApi.test.ts index 2b146a28faf65..99769412b8646 100644 --- a/packages/@doctolib/dmp/src/business/DmpApi.test.ts +++ b/packages/@doctolib/dmp/src/business/DmpApi.test.ts @@ -1609,33 +1609,78 @@ describe('DmpApi', () => { }) })

  • it('should throw when no cached session exists', async () => {
  • it('should return success: true on success', async () => {
  • getCachedDmpSessi …(truncated, 18145 more chars)

Now let me look at the actual implementation and test files in detail.

Tools used:

  • Bash: ls /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/

Tool results:

→ result (ok): AGENTS.md app babel.config.js backend.dependencies.codeowners.yml bin catalog-info.yaml ci CLAUDE.md ⇒ AGENTS.md CODEOWNERS CODEOWNERS.local component_backlog.yml config config.ru CONTRIBUTING.md db dev-env-setup-wsl dev-tools doc docker docker-compose.linux.yml docker-compose.specmatic.yml docker-compose.yml docs engine_metrics.yml engines fixtures frontend-metrics.config.ts frontend.dependencies.codeowners.yml Gemfile Gemfile.experimental ⇒ Gemfile Gemfile.experimental.lock Gemfile.lock Gemfil …(truncated, 559 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/business/DmpApi.ts (330–450)

Tool results:

→ result (ok): 330
331 throw e 332 } 333 } 334 335 const cachedSession = await getCachedDmpSession() 336 337 if (!cachedSession) { 338 throw new Error('No DMP session found') 339 } 340 341 const { sessionId } = cachedSession 342 const response = await getDocumentsContent({ sessionId, ...props }) 343 return response.Documents.map(this.toDocumentContent) 344 } 345 346 async updateDocumentStatus(props: DocumentStatusUpdateProps): Promise<DocumentStatusUpdat …(truncated, 3401 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/types/DmpApi.ts

Tool results:

→ result (ok): 1 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 2 import type { ClinicalDocument } from 'engines/cdar2/types/ClinicalDocument' 3 import type { DmpDocumentToAdd, DmpDocumentToDelete } from '../business/FrDmpConfig' 4 import type { DmpWorkflow, BillingSituation, GetDocumentsContentParams, PracticeLocationOverride } from './FrDmpTypes' 5
6 export type PatientConsent = 'error' | 'authorized' | 'expired' | 'forbidden' | 'noAuthorization' 7
8 export type PatientConsentU …(truncated, 5382 more chars)

There's a significant discrepancy between the PR diff and the local implementation. Let me read more carefully.

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/business/DmpApi.test.ts (1609–1739)

Tool results:

→ result (ok): 1609 }) 1610 }) 1611
1612 it('should return empty result on success', async () => { 1613 getCachedDmpSessionMocked.mockResolvedValue({ sessionId: 'session-abc', healthcareSettings: 'SA07' }) 1614 updateDocumentStatusCommandMocked.mockResolvedValue({ s_status: STATUS_OK }) 1615
1616 const dmpApi = new DmpApi(mockProps) 1617 const result = await dmpApi.updateDocumentStatus({ 1618 ins: '123456789012345678901', 1619 documentUniqueId: 'unique-do …(truncated, 4621 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.test.ts (560–690)

Tool results:

→ result (ok): 560
561 expect(result.status).toBe('success') 562 expect(result.result.payloads[0]).toEqual(expect.objectContaining({ id: 'doc-1', status: 'success' })) 563 }) 564 565 it('should return error result when updateDocumentStatus throws', async () => { 566 const mockDmpApi = createMockDmpApi() 567 jest.mocked(mockDmpApi.updateDocumentStatus).mockRejectedValue(new Error('DMP error')) 568 const adapter = new DmpNhrAdapter(mockDmpApi, undefined) 569 570 con …(truncated, 3685 more chars)

The local worktree is diverged from the PR diff — the local branch appears to be a partially-applied or earlier version. Let me compare both carefully and look at all relevant parts.

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.ts (200–280)

Tool results:

→ result (ok): 200 const typeCode = doc.cdaContent?.code?._code 201 const facet = findFacetForCDAType(typeCode, this.documentCategorizationFacets) 202 return toNhrDocumentContentResult(doc, facet) 203 }) 204 } 205 206 async updateDocumentMetadata(props: NhrDocumentMetadataUpdateProps): Promise<NhrDocumentMetadataUpdateResult> { 207 if (!props.patient?.nationalHealthIdentifier) { 208 throw new Error('patient_national_health_identifier_required') 209 } 210 211 const …(truncated, 2378 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/business/DmpApi.test.ts (2040–2140)

Tool results:

→ result (ok): 2040 uuid: 'uuid-doc-456', 2041 healthCareSettings: 'SA07', 2042 }) 2043
2044 expect(result).toEqual({}) 2045 }) 2046
2047 it('should return error result when dmpService throws BusinessError', async () => { 2048 mockDmpService.call.mockRejectedValue(new BusinessError('DMP returned error')) 2049
2050 const dmpApi = createDmpApiWithService() 2051 const result = await dmpApi.updateDocumentStatus({ 2052 ins: '123456 …(truncated, 3694 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/business/DmpApi.test.ts (1580–1675)

Tool results:

→ result (ok): 1580 it('should throw when setAuthorizationStatus returns non-OK status', async () => { 1581 setAuthorizationStatusMocked.mockResolvedValue({ s_status: 'ERROR' }) 1582
1583 const dmpApi = new DmpApi(mockProps) 1584
1585 await expect(dmpApi.updatePatientConsent('add')).rejects.toThrow('Error setting DMP Status, status: ERROR') 1586 }) 1587 }) 1588
1589 describe('updateDocumentStatus ', () => { 1590 it('should call updateDocumentStatusCommand with session and p …(truncated, 3272 more chars)

Now I have a clear picture. Let me also look at the NhrAdapter test for the partial-success case in the local file, and the DmpApiError class used in the adapter.

Tools used:

  • Bash: find /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib -name "DmpApiError*" 2>/dev/null

Tool results:

→ result (ok): /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/api/DmpApiError.test.ts /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/api/DmpApiError.ts

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.test.ts (1–61)

Tool results:

→ result (ok): 1 import { getPatientInsForDMP } from '@doctolib/dmp' 2 import type { DmpApi, DmpDocumentContent, SearchResult as DmpSearchResult } from '@doctolib/dmp' 3 import type { NhrDocumentSearchProps } from '@doctolib/tpf-national-health-records' 4 import type { DocumentCategorizationConcept, DocumentCategorizationFacet } from '@doctolib/documents-ui/types/Document' 5 import { DmpNhrAdapter } from './DmpNhrAdapter' 6 import { findFacetForCDAType } from '../utils/findFacetForCDAType' 7
8 jest.mock('../u …(truncated, 2117 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/api/DmpApiError.ts

Tool results:

→ result (ok): 1 import type { DmpApiErrorInfo } from '../types/DmpApi' 2
3 export class DmpApiError extends Error { 4 readonly apiErrorCode: string | undefined 5
6 readonly apiErrorType: string | undefined 7
8 readonly apiErrorContext: string | undefined 9
10 readonly apiErrorDescription: string | undefined 11
12 readonly apiErrorExtendedInformations: string | undefined 13
14 readonly apiErrorTypeDescription: string | undefined 15
16 readonly status: string 17
18 constructor(info: DmpA …(truncated, 730 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.test.ts (510–655)

Tool results:

→ result (ok): 510 id: 'facet-liaison', 511 name: 'Lettre de Liaison', 512 related_terms: [], 513 metadata: { filtering_terms: [], consultation_document_kinds: [] }, 514 } 515 jest.mocked(findFacetForCDAType).mockReturnValueOnce(mockFacet) 516 const mockDmpApi = createMockDmpApi(undefined, [dmpContentWithTypeCode]) 517 const adapter = new DmpNhrAdapter(mockDmpApi, minimalFacetsData) 518 519 const [first] = await adapter.getDocumen …(truncated, 5833 more chars)

Now I have a thorough understanding of both the PR diff and the local worktree state. Let me compare key divergences and check for the frDmpWorkflow guard in the implementation.

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/business/DmpApi.ts (343–403)

Tool results:

→ result (ok): 343 return response.Documents.map(this.toDocumentContent) 344 } 345 346 async updateDocumentStatus(props: DocumentStatusUpdateProps): Promise<DocumentStatusUpdateResult> { 347 const { ins, documentUniqueId: uniqueId, uuid, healthCareSettings, getTransactionFrames } = props 348 349 if (this.dmpService) { 350 const payload = buildUpdateDocumentStatusPayload({ 351 ins, 352 uniqueId, 353 uuid, 354 healthCareSettings, 355 getTransactionF …(truncated, 1444 more chars)

Tools used:

  • Read: /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224/packages/@doctolib/dmp/src/api/DmpApiError.test.ts

Tool results:

→ result (ok): 1 import { DmpApiError } from './DmpApiError' 2 import type { DmpApiErrorInfo } from '../types/DmpApi' 3
4 describe('DmpApiError', () => { 5 describe('message assembly', () => { 6 it('combines description and extended info when both are present', () => { 7 const info: DmpApiErrorInfo = { 8 apiErrorDescription: 'Technical software error', 9 apiErrorExtendedInformations: 'Operation timed out.', 10 status: 'ERROR', 11 } 12 const error = new DmpApiErr …(truncated, 3083 more chars)

I now have a complete picture. Let me do one final check to confirm the discrepancy between the PR diff version and the local worktree version — specifically around the frDmpWorkflow guard and the success field.

Tools used:

  • Bash: cd /Users/USER/workspace/doctolib/doctolib && gh pr diff 241133 -- packages/@doctolib/dmp/src/business/DmpApi.ts 2>&1 | head -100

Tool results:

→ result (ok): accepts at most 1 arg(s), received 2

Tools used:

  • Bash: cd /Users/USER/workspace/doctolib/doctolib && gh pr view 241133 --json headRefName,baseRefName 2>&1

Tool results:

→ result (ok): {"baseRefName":"master","headRefName":"FHIR-2224-monolith-return-doc-status-update-results-from-dmp-api"}

Tools used:

  • Bash: cd /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224 && git log --oneline -5 2>&1

Tool results:

→ result (ok): 1cec77f7f3d2 FHIR-2224: Handle errors

Tools used:

  • Bash: cd /Users/USER/workspace/doctolib/worktrees/doctolib/FHIR-2224 && git branch 2>&1

Tool results:

→ result (ok): * (no branch) FHIR-2020-implement-hl-findDocuments-api FHIR-2021-implement-hl-get-documents-content-by-unique-id FHIR-2022-implement-hl-updateDocumentVisibilityByUniqueId FHIR-2023-implement-hl-updateDocumentStatusByUniqueId FHIR-2031-implement-hl-getDocumentHistoryByUniqueId FHIR-2036-implement-hl-setDmpAccessMode FHIR-2087-nhr-document-list-dmp-column-configs-dmp-columns FHIR-2091-bump-tpf-national-health-records-ui-12 + FHIR-2091-nhr-document-list-pagination FHIR-2094_nhr-do …(truncated, 1779 more chars)

The local worktree is in a detached HEAD state that doesn't match the PR branch. The actual PR branch FHIR-2224-monolith-return-doc-status-update-results-from-dmp-api isn't checked out locally. The PR diff is the ground truth. Let me verify what the PR diff actually introduces vs what we can test against — especially the type divergence (PR uses { success: true/false } discriminated union, while local code uses { error?: DmpApiErrorInfo }).

Looking at the PR diff again carefully, there is a key question: the PR diff shows DocumentStatusUpdateResult as a discriminated union { success: true } | { success: false; error: DmpApiErrorInfo }, while the local DmpApi.ts at line 186-188 defines it as { error?: DmpApiErrorInfo }. The local file is an older/diverged version. The PR diff is authoritative.

Now I have everything needed for a thorough analysis. Let me compile the findings.


Test Coverage Analysis: PR #241133 — feat(FHIR-2224): return doc status update results from DmpApi

Summary

The PR converts updateDocumentStatus from a throw-on-failure void function to one that returns a structured DocumentStatusUpdateResult discriminated union ({ success: true } | { success: false; error: DmpApiErrorInfo }). Test coverage is generally solid, with good positive and negative cases in both the @doctolib/dmp and @doctolib/national-health-records packages. However, there are meaningful gaps, a critical behavioral inconsistency between the PR diff and the local worktree, several tests that validate non-existent behavior, and one test that is directly contradicted by the implementation.


Critical Gaps

1. Missing test: non-BusinessError propagation in the dmpService path (Criticality: 9)

File: packages/@doctolib/dmp/src/business/DmpApi.test.ts (within the with dmpService describe block)

The PR diff adds a test titled "should return error result when dmpService throws an unexpected error" that mocks mockDmpService.call.mockRejectedValue(new Error('Network failure')) and expects a { success: false, error: ... } result. However, the actual implementation in the local worktree (line 361–367 of DmpApi.ts) and the PR's DmpApi.ts diff shows that for the dmpService path, only BusinessError is caught and returned as a structured error — all other errors are re-thrown with throw e. This means the test in the PR diff describes behavior that does not exist in the implementation. If this test is committed in the form shown in the PR diff, it will fail. If the implementation was also changed to swallow non-BusinessError exceptions, the re-throw on line 366 (local) or its equivalent is silently removed — but the test would then miss verifying that non-BusinessError exceptions continue to propagate (the original contract). Either way, there is no test confirming that a non-BusinessError thrown from this.dmpService.call is NOT caught and IS propagated to the caller.

Specific failure this prevents: a caller wrapping updateDocumentStatus in a try/catch expecting network-level errors to propagate would silently receive a { success: false } result if the implementation absorbs them, making infrastructure failures invisible.

2. Missing test: no-session error path does not return structured result in the legacy (iCanopée) path (Criticality: 8)

File: packages/@doctolib/dmp/src/business/DmpApi.test.ts, line 1627

The PR diff replaces the rejects.toThrow('No DMP session found') test with one that asserts a structured error result. The local DmpApi.ts at line 372–374 still throws (throw new Error('No DMP session found')). The DmpNhrAdapter.ts local code (line 219–258) wraps calls in try/catch and would turn the thrown error into an error payload result — but the PR diff's version of DmpNhrAdapter.ts removes the try/catch entirely, relying solely on result.success. If the DmpApi implementation still throws when there is no session (as in the local worktree), and DmpNhrAdapter no longer has a try/catch, this path produces an unhandled rejection rather than a graceful error payload.

The tests for DmpNhrAdapter.updateDocumentMetadata do not include a test that verifies behavior when updateDocumentStatus throws (rather than returning a structured error) in the PR's new version of the adapter — which means this failure mode is undetected.

3. Missing test: updateDocumentStatusCommand throws in the legacy iCanopée path (Criticality: 7)

File: packages/@doctolib/dmp/src/business/DmpApi.test.ts

The PR diff introduces a test "should return error result when updateDocumentStatusCommand throws" for the iCanopée path. The local worktree's test file does not include this test at all. There is no coverage for what happens when updateDocumentStatusCommand itself rejects (e.g., network error, timeout) in the legacy path. The PR diff adds a try/catch around the entire updateDocumentStatusCommand call (unlike the local worktree which does not have this try/catch), so this is a new branch needing verification.

4. Missing integration between DmpNhrAdapter and the success field shape (Criticality: 7)

File: packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.test.ts, line 623–638

The "partial success" test at line 623 uses .mockResolvedValueOnce({}).mockRejectedValueOnce(new Error('fail')). In the PR diff, the new adapter no longer has a try/catch, so a thrown rejection from updateDocumentStatus is NOT caught and will propagate as an unhandled promise rejection rather than being turned into an error payload. The mock for the "partial success" test needs to use .mockResolvedValueOnce({ success: true }).mockResolvedValueOnce({ success: false, error: ... }) — not a rejection. The existing test is testing behavior that no longer exists in the new adapter implementation. This test will give a false green result if the new implementation silently catches unhandled rejections or will give a false red result when run against the new implementation.


Important Improvements

5. No test for the frDmpWorkflow required guard (Criticality: 6)

File: packages/@doctolib/dmp/src/business/DmpApi.ts, line 347 (local), packages/@doctolib/dmp/src/business/DmpApi.test.ts

The original DmpApi.ts contains if (!this.props.frDmpWorkflow) throw new Error('frDmpWorkflow is required to update document status'). This guard is early-exit logic that predates this PR, and it still throws rather than returning a structured error. No test in the PR covers this path. If future refactoring of the dmpService guard is applied, the early frDmpWorkflow throw might interact unexpectedly with the NhrAdapter's new assumption that all errors are returned as values.

6. No test asserting updateDocumentStatus is called WITHOUT healthCareSettings in the NhrAdapter post-PR (Criticality: 6)

File: packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.test.ts, line 541–553

The PR diff's new DmpNhrAdapter removes healthCareSettings from the updateDocumentStatus call (no longer passes it). The test "should call dmpApi.updateDocumentStatus with correct params for status payload" in the local worktree at line 548 still asserts healthCareSettings: 'SA07' as part of the expected call. This test would fail against the PR's new adapter implementation — and would be a good regression guardrail in the other direction too: confirming that healthCareSettings is NOT passed once removed.

7. No test for apiErrorExtendedInformations-only message path (Criticality: 5)

File: packages/@doctolib/dmp/src/api/DmpApiError.test.ts, line 34–38

The DmpApiError class test at line 34 does test apiErrorExtendedInformations-only behavior. However, there is no equivalent test in DmpNhrAdapter.test.ts that passes a structured error containing only apiErrorExtendedInformations (without apiErrorDescription) through the full `updat …(truncated, 5158 more chars)

Keyboard shortcuts

⌘K / Ctrl+KOpen command palette
/Focus search
g hGo to home
g pGo to projects
g sGo to sessions
j / kNext / prev row (tables)
?Show this help
EscClose dialogs

Structured queries

Mix key:value filters with free text in the palette:

type:sessionOnly session pages
project:llm-wikiFilter by project name (substring)
model:claudeFilter by model name (substring)
date:>2026-03-01Sessions after a date
date:<2026-04-01Sessions before a date
tags:rustPages mentioning a tag/topic
sort:dateSort results by date (newest first)

Example: type:session project:llm-wiki date:>2026-04 sort:date