{
  "id": "doctolib-doctolib/vast-weaving-stearns-subagent-afe49a68",
  "slug": "vast-weaving-stearns-subagent-afe49a68",
  "title": "Session: vast-weaving-stearns-subagent-afe49a68 — 2026-04-22",
  "type": "source",
  "project": "doctolib-doctolib",
  "date": "2026-04-22",
  "started": "2026-04-22T13:41:07.518000+00:00",
  "ended": "2026-04-22T13:42:54.719000+00:00",
  "model": "claude-sonnet-4-6",
  "cwd": "/Users/USER/workspace/doctolib/doctolib",
  "git_branch": ".invalid",
  "permission_mode": "",
  "user_messages": 1,
  "tool_calls": 27,
  "tools_used": [
    "Bash",
    "Read"
  ],
  "is_subagent": true,
  "wikilinks_out": [],
  "body_text": "Project: doctolib-doctolib · Branch: .invalid · Mode:  · Model: claude-sonnet-4-6\n\nStats: 1 user messages, 27 tool calls, tools used: Bash, Read.\n\nConversation\n\nTurn 1 — User\n\nFinal test coverage review of the fhir-2214_nhr-error-type-extension-and-modal-toast branch in /Users/USER/workspace/doctolib/treatment-plan.\n\nRun: cd ~/workspace/doctolib/treatment-plan && git diff main...HEAD -- packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx to see the test changes.\n\nContext: PR adds error toast handling to NhrDocumentListModal. Tests cover:\n1. Error toast dispatched with Error.message when searchDocuments throws an Error\n2. i18n fallback used as message (not raw thrown value) when non-Error is thrown — now asserts expect.not.stringContaining('string error') AND message === title\n3. Loading stops + cells cleared (verified inside waitFor) after error\n4. Toast dispatched per failed fetch when filters change\n5. No toast on success\n\nPrevious test gaps that were fixed:\n- Added title: expect.any(String) assertion to Error case\n- Added expect.not.stringContaining('string error') to guard non-Error fallback\n- Moved empty-cells check inside waitFor to avoid racing the skeleton\n\nAre there any remaining critical coverage gaps?\n\nTurn 1 — Assistant\n\nLet me examine the current state of the tests and the implementation to give a thorough assessment.\n\nTools used:\n\n- Bash: cd ~/workspace/doctolib/treatment-plan && git diff main...HEAD -- packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\n\nTools used:\n\n- Bash: cd ~/workspace/doctolib/treatment-plan && git diff main...HEAD -- packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/\n\nTool results:\n\n  → result (ok): diff --git a/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx b/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\nindex d91977595..6940d797b 100644\n--- a/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\n+++ b/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\n@@ -8,6 +8,8 @@\n…(truncated, 4599 more chars)\n\nTool results:\n\n  → result (ok): diff --git a/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx b/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\nindex d91977595..6940d797b 100644\n--- a/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\n+++ b/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\n@@ -8,6 +8,8 @@\n…(truncated, 6537 more chars)\n\nNow let me read the full implementation and the existing test file to understand the complete picture.\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.tsx\n\nTool results:\n\n  → result (ok): 1\timport { t } from '#i18n'\n2\timport { Modal } from '@doctolib/design-system/Modal'\n3\timport { ModalBody } from '@doctolib/design-system/ModalBody'\n4\timport type { NhrDocument } from '@doctolib/tpf-national-health-records'\n5\timport { useEffect, useMemo, useState } from 'react'\n6\t\n7\timport { addToast } from '../../business/toast'\n8\timport type { ActionConfig, ColumnConfig, FilterConfig, NhrPatientInfo, SearchDocumentsFn } from '../../types'\n9\timport { NhrDocumentList } from '../NhrDocumentList/Nh\n…(truncated, 2776 more chars)\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\n\nTool results:\n\n  → result (ok): 1\timport type { DesignSystemIconComponent } from '@doctolib/design-system-icons'\n2\timport { setup } from '@doctolib/test-helpers'\n3\timport { screen } from '@testing-library/react'\n4\timport { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'\n5\t\n6\timport { mockColumns, mockPatientInfo } from '../../test-helpers'\n7\timport { nhrDocumentFixtureBuilder } from '../../test-helpers/fixtures/nhrDocumentFixtureBuilder'\n8\timport type { ActionConfig, FilterConfig } from '../../types'\n9\timport {\n…(truncated, 11328 more chars)\n\nNow let me look at the toast business module and the broader context to understand what contracts need verifying.\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business -type f | sort\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createMoreActionsAction.test.ts\n/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createMoreActionsAction.ts\n/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createViewDocumentAction.test.ts\n/Users/USER/workspace/doctolib/treatment-plan/packages/tp\n…(truncated, 3847 more chars)\n\nTools used:\n\n- Bash: cd ~/workspace/doctolib/treatment-plan && git diff main...HEAD -- packages/tpf-national-health-records-ui/src/business/\n\nTool results:\n\n  → result (ok): diff --git a/packages/tpf-national-health-records-ui/src/business/toast.ts b/packages/tpf-national-health-records-ui/src/business/toast.ts\nnew file mode 100644\nindex 000000000..c44c729f8\n--- /dev/null\n+++ b/packages/tpf-national-health-records-ui/src/business/toast.ts\n@@ -0,0 +1,13 @@\n+import { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core'\n+import type { ReactNode } from 'react'\n+\n+type ToastProps = {\n+  message: ReactNode\n+  title: string\n+  uiStyle: 'info' | 'success' | 'error' | 'war\n…(truncated, 188 more chars)\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/toast.ts\n\nTool results:\n\n  → result (ok): 1\timport { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core'\n2\timport type { ReactNode } from 'react'\n3\t\n4\ttype ToastProps = {\n5\t  message: ReactNode\n6\t  title: string\n7\t  uiStyle: 'info' | 'success' | 'error' | 'warning'\n8\t  action?: { message: string; onClick: () => void }\n9\t}\n10\t\n11\texport function addToast(props: ToastProps) {\n12\t  GLOBAL_PUBSUB_REGISTRY.dispatch({ type: 'toasts:add', payload: props })\n13\t}\n14\n\nTools used:\n\n- Bash: cd ~/workspace/doctolib/treatment-plan && git diff main...HEAD -- packages/tpf-national-health-records-ui/ --name-only | sort\n\nTool results:\n\n  → result (ok): }\n     const fetchDocuments = async () => {\n     expect(await screen.findByText('42 results')).toBeInTheDocument()\n     setDocumentsState((prev) => ({ ...prev, isLoading: true }))\n     void fetchDocuments()\n   \"entry_point.open\": \"Open NHR\",\n   \"entry_point.open\": \"Ouvrir NHR\",\n   \"filters.date_selection.custom_range.label\": \"Custom date range\",\n   \"filters.date_selection.custom_range.label\": \"Plage de dates personnalisée\",\n   \"filters.date_selection.last_access.label\": \"Depuis ma dernière conne\n…(truncated, 8758 more chars)\n\nNow let me check the locale files for the exact i18n key, and look at whether addToast is a direct call or wraps GLOBAL_PUBSUB_REGISTRY, plus whether there's any test for toast.ts itself.\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src -name \".json\" | xargs grep -l \"errors\" 2>/dev/null\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/locales/fr/tpf_national_health_records_ui.json\n/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/locales/en/tpf_national_health_records_ui.json\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src -name \"toast\" | sort\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/toast.ts\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/locales/en/tpf_national_health_records_ui.json\n\nTool results:\n\n  → result (ok): 1\t{\n2\t  \"entry_point.open\": \"Open NHR\",\n3\t  \"errors.search.title\": \"Unable to load DMP documents\",\n4\t  \"filters.date_selection.custom_range.label\": \"Custom date range\",\n5\t  \"filters.date_selection.last_access.label\": \"Since I last accessed this DMP\",\n6\t  \"filters.date_selection.last_access.message\": \"Last accessed on:\",\n7\t  \"translation\": \"Translation\"\n8\t}\n9\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui -name \".test.\" | sort\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/node_modules/@module-federation/cli/dist/__tests__/readConfig.integration.test.d.ts\n/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/node_modules/@storybook/test/node_modules/@testing-library/jest-dom/types/__tests__/bun/bun-custom-expect-types.test.ts\n/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/node_modules/@storybook/test/node_modu\n…(truncated, 8102 more chars)\n\nTools used:\n\n- Bash: grep -r \"addToast\\|toast\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src --include=\".test.\" -l 2>/dev/null\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx\n\nTools used:\n\n- Bash: grep -r \"isActionLoading\\|action-loading-overlay\\|wrappedActions\\|finally\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src --include=\".test.\" 2>/dev/nu\n…(truncated, 13 more chars)\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx:    expect(screen.getByTestId('action-loading-overlay')).toBeInTheDocument()\n/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.test.tsx:    expect(screen.queryByTestId('action-loading-overlay')).not.toBeInTheDocument()\n\nTools used:\n\n- Bash: grep -r \"action.error\\|onClick.reject\\|action.throw\\|action.catch\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src --include=\".test.\" 2>/dev/null |\n…(truncated, 9 more chars)\n\nTool results:\n\n  → result (ok): (Bash completed with no output)\n\nTools used:\n\n- Bash: grep -n \"isOpen.false\\|modal.closed\\|toast\\|addToast\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListMo\n…(truncated, 35 more chars)\n\nTool results:\n\n  → result (ok): 11:vi.mock('../../business/toast', () => ({ addToast: vi.fn() }))\n49:  it('should not be visible when isOpen is false', () => {\n50:    setup(<NhrDocumentListModal {...defaultProps()} isOpen={false} onClose={vi.fn()} />)\n194:    it('should dispatch an error toast with the error message when searchDocuments throws an Error', async () => {\n196:      const { addToast } = await import('../../business/toast')\n202:        expect(addToast).toHaveBeenCalledWith(\n214:      const { addToast } = await impor\n…(truncated, 713 more chars)\n\nTools used:\n\n- Bash: grep -n \"isOpen.false\\|modal.closed\\|unmount\\|cleanup\\|abort\\|cancel\\|unmounted\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocument\n…(truncated, 46 more chars)\n\nTool results:\n\n  → result (ok): (Bash completed with no output)\n\nTools used:\n\n- Bash: grep -n \"useEffect\\|cleanup\\|return\\|abort\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.tsx 2>/d\n…(truncated, 7 more chars)\n\nTool results:\n\n  → result (ok): 5:import { useEffect, useMemo, useState } from 'react'\n44:  useEffect(() => {\n86:  return (\n\nTools used:\n\n- Bash: grep -n \"isOpen\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.tsx 2>/dev/null\n\nTool results:\n\n  → result (ok): 12:  isOpen: boolean\n23:  isOpen,\n87:    <Modal show={isOpen} onHide={onClose} size='fullscreen' title={title} aria-label={title}>\n\nTools used:\n\n- Bash: grep -rn \"clearAllMocks\\|restoreMocks\\|resetMocks\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/ --include=\".ts\" --include=\".json\" --exclude-dir=node_mo\n…(truncated, 28 more chars)\n\nTool results:\n\n  → result (ok): (Bash completed with no output)\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui -name \"vitest.config\" -o -name \"vite.config\" | grep -v node_modules | sort\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/.storybook/vitest.config.ts\n/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/vite.config.ts\n/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/vitest.config.ts\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/vitest.config.ts\n\nTool results:\n\n  → result (ok): 1\timport { importSingleTs } from 'import-single-ts'\n2\timport { defineConfig, mergeConfig } from 'vitest/config'\n3\timport { sharedAliases } from '../../vitest-shared.config'\n4\t\n5\tconst upFrontVitest = (await importSingleTs('@doctolib/upfront-dev/vitest.config.ts')).default\n6\t\n7\texport default defineConfig((configEnv) =>\n8\t  mergeConfig(upFrontVitest(configEnv), {\n9\t    test: {\n10\t        name: '@doctolib/tpf-national-health-records-ui',\n11\t        root: new URL('./', import.meta.url).pathname, //\n…(truncated, 409 more chars)\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/treatment-plan -name \"vitest.config.ts\" -path \"/upfront-dev/\" | grep -v node_modules | head -3\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/treatment-plan -path \"*/upfront-dev/vitest.config.ts\" 2>/dev/null | head -3\n\nTool results:\n\n  → result (ok): (Bash completed with no output)\n\nTool results:\n\n  → result (ok): (Bash completed with no output)\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/treatment-plan/node_modules/@doctolib/upfront-dev -name \"vitest.config.ts\" 2>/dev/null | head -3\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/treatment-plan/node_modules/@doctolib/upfront-dev/bases/vitest.config.ts\n/Users/USER/workspace/doctolib/treatment-plan/node_modules/@doctolib/upfront-dev/bases/storybook/vitest.config.ts\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/treatment-plan/node_modules/@doctolib/upfront-dev/bases/vitest.config.ts\n\nTool results:\n\n  → result (ok): 1\t// A core Vite configuration for UpFront packages\n2\t//\n3\t// @see https://vitest.dev/config/\n4\timport { configDefaults, defaultExclude, defineConfig } from 'vitest/config'\n5\timport { packageDirectory } from 'pkg-dir'\n6\timport react from '@vitejs/plugin-react'\n7\timport { resolve as resolvePaths } from 'node:path'\n8\t\n9\timport { getEnvDefines } from './env/vite-defines'\n10\t\n11\t// DEV NOTE: there is zero situation where packageDirectory() wouldn't return\n12\t// a string in our development patterns\n…(truncated, 2145 more chars)\n\nNow I have a complete picture. Let me check one final important detail — whether the useEffect has no cleanup and what that means for in-flight requests when isOpen toggles.\n\nTools used:\n\n- Bash: grep -n \"isOpen\\|searchDocuments\\|appliedFilters\\|useEffect\" /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentL\n…(truncated, 12 more chars)\n\nTool results:\n\n  → result (ok): 5:import { useEffect, useMemo, useState } from 'react'\n12:  isOpen: boolean\n18:  searchDocuments: SearchDocumentsFn\n23:  isOpen,\n29:  searchDocuments,\n41:  const [appliedFilters, setAppliedFilters] = useState<Record<string, unknown>>({})\n44:  useEffect(() => {\n49:        const { data, total: fetchedTotal } = await searchDocuments(appliedFilters)\n67:  }, [searchDocuments, appliedFilters])\n87:    <Modal show={isOpen} onHide={onClose} size='fullscreen' title={title} aria-label={title}>\n95:         \n…(truncated, 32 more chars)\n\nI now have everything I need for a complete assessment. Here is the analysis.\n\n---\n\nSummary\n\nThe five new tests are well-scoped, test behavioral contracts rather than implementation details, and cover the primary happy/sad paths introduced by this PR. The mock isolation via vi.mock at module scope with restoreMocks: true in the vitest config is correctly handled. Overall coverage quality is good. There are two remaining gaps worth noting — one moderate and one minor — and one test quality concern.\n\n---\n\nCritical Gaps\n\nNone at the critical (8-10) level.\n\n---\n\nImportant Improvements\n\n1. No toast when the component unmounts or closes while a fetch is in-flight (rating: 6/10)\n\nThe useEffect at line 44-67 of NhrDocumentListModal.tsx has no cleanup function — it does not cancel the in-flight fetchDocuments promise. The useEffect dependency array is [searchDocuments, appliedFilters], and isOpen is deliberately excluded from it. This means:\n\n- If searchDocuments throws after the modal has been closed (the Modal hides but the component is still mounted), addToast is still called on unmounted or hidden state, and setDocumentsState is called on a component that the user has already dismissed.\n- There is no test asserting that closing the modal mid-fetch does not fire a spurious error toast when the promise eventually rejects.\n\nThe scenario: open the modal, the fetch starts, close the modal before it resolves, the fetch then rejects — a toast fires even though the user dismissed the UI. This is a real UX regression that could appear in production under slow network conditions.\n\nWhat to test: render with isOpen={true}, capture the deferred promise, trigger close (onClose), then reject the promise, and assert addToast was NOT called (or that setDocumentsState did not update the state after unmount). The test would catch any future addition of a cleanup/AbortController that accidentally breaks this path, or confirm the current behavior is intentional.\n\n2. The title field is never asserted to be the specific i18n string — only expect.any(String) (rating: 5/10)\n\nBoth the Error case and the non-Error fallback case assert title: expect.any(String). If the t() call silently fails (missing key, misconfigured i18n in the test environment) and returns a key path like \"tpf_national_health_records_ui.errors.search.title\" or an empty string, the test still passes. The non-Error fallback test additionally asserts message === title, but neither checks the human-readable value.\n\nThe locale file at /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/locales/en/tpf_national_health_records_ui.json has \"errors.search.title\": \"Unable to load DMP documents\". Asserting title: 'Unable to load DMP documents' in the Error case would catch i18n misconfiguration silently falling through. This is low-risk if the test environment is confirmed to use real i18n resolution, but the current setup file would need to be verified.\n\n---\n\nTest Quality Issues\n\nThe addToast import pattern creates a latent ordering risk\n\nEach error test does const { addToast } = await import('../../business/toast') inside the test body, after vi.mock has been declared at module scope. This works correctly today because vi.mock is hoisted and the dynamic import returns the mocked module. However, the vi.mocked(addToast) call at line 230 in the non-Error fallback test accesses .mock.calls[0]?.[0] with optional chaining and no null-assert, meaning if addToast was never actually called, firstCall would be undefined and the test would silently pass without verifying anything meaningful.\n\nConcretely: if a future refactor stops calling addToast in the non-Error branch, the waitFor assertion would catch it, but only because expect.objectContaining(...) requires the call to have happened. The trailing expect(firstCall?.message).toBe(firstCall?.title) would evaluate to expect(undefined).toBe(undefined) which is vacuously true. The guard is the waitFor block above — it would fail first — so this is not a real gap currently, but it is worth noting that the final two lines of the non-Error test provide weaker guarantees than they appear to.\n\n---\n\nPositive Observations\n\n- Mocking ../../business/toast at the module level with vi.mock rather than spying on addToast directly is the correct approach; it prevents the real GLOBAL_PUBSUB_REGISTRY.dispatch from being called in tests.\n- Using vi.waitFor with the expectation inside (rather than await somePromise; expect(...) after) is the right pattern for async side-effects in vitest/RTL.\n- Moving the empty-cell assertion inside waitFor correctly avoids the skeleton-vs-settled race that was previously present.\n- The filter change test (test 4) correctly calls vi.clearAllMocks() implicitly via restoreMocks: true per-test, and uses toHaveBeenCalledTimes(2) rather than a weaker matcher, ensuring both fetches fire a toast.\n- The success test (test 5) anchors on a rendered document title (findByText('SOPK test results')) before asserting not.toHaveBeenCalled(), which correctly awaits the settled state before making the negative assertion.",
  "sha256": "5bfb58b8185b78a1",
  "source_url": "sessions/doctolib-doctolib/2026-04-22T13-41-doctolib-doctolib-vast-weaving-stearns-subagent-afe49a68.html"
}