{
  "id": "doctolib-doctolib/you-are-a-senior-functional-ullman-subagent-a8d3350b",
  "slug": "you-are-a-senior-functional-ullman-subagent-a8d3350b",
  "title": "Session: you-are-a-senior-functional-ullman-subagent-a8d3350b — 2026-04-22",
  "type": "source",
  "project": "doctolib-doctolib",
  "date": "2026-04-22",
  "started": "2026-04-22T08:58:33.632000+00:00",
  "ended": "2026-04-22T09:00:53.798000+00:00",
  "model": "claude-haiku-4-5-20251001",
  "cwd": "/Users/USER/workspace/doctolib/doctolib",
  "git_branch": ".invalid",
  "permission_mode": "",
  "user_messages": 1,
  "tool_calls": 21,
  "tools_used": [
    "Bash",
    "Read"
  ],
  "is_subagent": true,
  "wikilinks_out": [],
  "body_text": "Project: doctolib-doctolib · Branch: .invalid · Mode:  · Model: claude-haiku-4-5-20251001\n\nStats: 1 user messages, 21 tool calls, tools used: Bash, Read.\n\nConversation\n\nTurn 1 — User\n\nExplore the Oxygen design system at /Users/USER/workspace/doctolib/oxygen/ to find toast notification components.\n\n1. Search for \"Toast\", \"toast\", \"notification\", \"Notification\", \"alert\", \"Alert\" components in the packages directory\n2. Find the toast component API - what props does it accept? How is it triggered?\n3. Look for useToast, ToastProvider, toast() hooks or utilities\n4. Check /Users/USER/workspace/doctolib/oxygen/packages/ for relevant packages\n5. Look for any error-specific toast variants (error, warning, info, success)\n6. Find any examples of how the toast is used in the monolith at /Users/USER/workspace/doctolib/doctolib/\n\nReport the full component API, import paths, and usage examples.\n\nTurn 1 — Assistant\n\nI'll help you explore the Oxygen design system to find toast notification components. Let me start by searching through the oxygen directory structure.\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/oxygen/packages -type f -name \"toast\" -o -name \"Toast\" | head -20\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/oxygen/packages/core/src/feedbacks/Toast.mdx\n/Users/USER/workspace/doctolib/oxygen/packages/core/src/feedbacks/ToastExamples.svg\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/toast.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/ToastQueue.test.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/ToastQueue.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/toast.test.ts\n/Users/USER/workspac\n…(truncated, 588 more chars)\n\nGreat! I found the toast component. Now let me explore the structure and read the key files.\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/toast/src\n\nTool results:\n\n  → result (ERROR): EISDIR: illegal operation on a directory, read '/Users/USER/workspace/doctolib/oxygen/packages/toast/src'\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/oxygen/packages/toast -type f \\( -name \".ts\" -o -name \".tsx\" -o -name \".d.ts\" \\) | grep -v test | grep -v node_modules\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/oxygen/packages/toast -name \"index.ts\" -o -name \"index.tsx\"\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/oxygen/packages/toast/src/index.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/toast.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/ToastQueue.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/Timer.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/helpers/environment.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/Toast/index.ts\n/Users/USER/workspace/doctolib/oxygen/pac\n…(truncated, 221 more chars)\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/oxygen/packages/toast/src/index.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/Toast/index.ts\n/Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/ToastCard/index.ts\n\nNow let me read the main files:\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/index.ts\n\nTool results:\n\n  → result (ok): 1\texport { Toast } from '#components/Toast'\n2\texport { addToast, closeToast } from '#business/toast'\n3\t\n\n<system-reminder>\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n</system-reminder>\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/toast.ts\n\nTool results:\n\n  → result (ok): 1\timport { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core'\n2\timport { v4 as uuidV4 } from 'uuid'\n3\t\n4\timport type { ToastProps } from './ToastQueue'\n5\t\n6\texport const ADD_TOAST = 'toast:add'\n7\texport const CLOSE_TOAST = 'toast:close'\n8\t\n9\texport function addToast(props: ToastProps): string {\n10\t  const id = uuidV4()\n11\t  GLOBAL_PUBSUB_REGISTRY.dispatch({ type: ADD_TOAST, payload: { ...props, id } })\n12\t  return id\n13\t}\n14\t\n15\texport function closeToast(id: string) {\n16\t  GLOBAL_PUBSUB_REG\n…(truncated, 402 more chars)\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/Toast/Toast.tsx\n\nTool results:\n\n  → result (ok): 1\timport { ADD_TOAST, CLOSE_TOAST } from '#business/toast'\n2\timport { getToastQueue, type QueuedToast, type ToastDuration, type ToastProps } from '#business/ToastQueue'\n3\timport ReactDOM from 'react-dom'\n4\timport { ToastCard } from '#components/ToastCard'\n5\timport { useCallback, useMemo, useRef, useSyncExternalStore } from 'react'\n6\timport { usePubSub } from '@doctolib/upfront-core'\n7\t\n8\timport styles from './Toast.module.scss'\n9\t\n10\texport const Toast = ({\n11\t  defaultDuration = 'infinite',\n12\t\n…(truncated, 2217 more chars)\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/ToastCard/ToastCard.tsx\n\nTool results:\n\n  → result (ok): 1\timport { type Action, Animation, type QueuedToast } from '#business/ToastQueue'\n2\timport { Button } from '@doctolib/design-system/Button'\n3\timport { CircleCheckSolidIcon } from '@doctolib/design-system-icons/CircleCheckSolidIcon'\n4\timport classNames from 'classnames'\n5\timport type { DesignSystemIconComponent } from '@doctolib/design-system-icons'\n6\timport { DiamondExclamationSolidIcon } from '@doctolib/design-system-icons/DiamondExclamationSolidIcon'\n7\timport { IconButton } from '@doctolib/des\n…(truncated, 5302 more chars)\n\nNow let me read the ToastQueue to understand the full API:\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/ToastQueue.ts\n\nTool results:\n\n  → result (ok): 1\timport { isTestEnv } from '#helpers/environment'\n2\timport type { MouseEventHandler, ReactNode } from 'react'\n3\timport type { ToastUIStyle } from '#components/ToastCard'\n4\t\n5\timport { Timer } from './Timer'\n6\t\n7\texport type Action = {\n8\t  dataWalkme?: string\n9\t  label: string\n10\t  onClick: MouseEventHandler\n11\t}\n12\t\n13\texport type ToastDuration = number | 'infinite'\n14\t\n15\texport type ToastProps = {\n16\t  action?: Action\n17\t  dataWalkme?: string\n18\t  duration?: ToastDuration\n19\t  message?: React\n…(truncated, 4294 more chars)\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/core/src/feedbacks/Toast.mdx\n\nTool results:\n\n  → result (ok): 1\t\n2\timport { Meta } from '@storybook/addon-docs/blocks'\n3\timport ToastExamples from './ToastExamples.svg'\n4\timport { AlertBanner } from '../indicator/Alert/AlertBanner'\n5\t\n6\t<Meta title=\"feedbacks/Toast\" />\n7\t\n8\t# Toast\n9\t\n10\tToast is a feedback component that appears in reaction to a user action (such as editing, creating, or deleting) or is auto-generated for notifications (meaning it is system-generated).  \n11\tThus, toasts need to inform users while always remaining relevant and as minimally\n…(truncated, 4341 more chars)\n\nNow let me search for usage examples in the doctolib monolith:\n\nTools used:\n\n- Bash: grep -r \"addToast\\|closeToast\\|from '@doctolib/toast'\" /Users/USER/workspace/doctolib/doctolib --include=\".ts\" --include=\".tsx\" | head -30\n\nTools used:\n\n- Bash: grep -r \"Toast.defaultDuration\\|Toast.position\" /Users/USER/workspace/doctolib/doctolib --include=\".tsx\" | head -20\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/doctolib/app/assets/javascripts/contexts/doctor/desktop/tlsiServices/TlsiService.ts:import { addToast } from 'hooks/useToast'\n/Users/USER/workspace/doctolib/doctolib/app/assets/javascripts/contexts/doctor/desktop/tlsiServices/TlsiService.ts:  addToast({\n/Users/USER/workspace/doctolib/doctolib/app/assets/javascripts/components/doctor/mobile/pages/ShowDocument.tsx:  const { add: addToast, remove: removeToast } = useContext(ToastContext)\n/Users/USER/workspace/doctolib\n…(truncated, 3920 more chars)\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/doctolib/app/assets/javascripts/entrypoints-content/doctor-desktop.tsx:        <Toaster defaultDuration={getEnvironment() === 'test' ? 'infinite' : 5000} />\n/Users/USER/workspace/doctolib/doctolib/app/assets/javascripts/entrypoints-content/doctor-billing-mobile-offline.tsx:        <ToastProvider position=\"top\">\n/Users/USER/workspace/doctolib/doctolib/app/assets/javascripts/components/patient/desktop/modules/appointments/TemporaryAppointmentBanner.tsx:    <ToastProv\n…(truncated, 749 more chars)\n\nI see there are two toast systems in the doctolib monolith. Let me examine the useToast hook and also check for the newer Oxygen toast usage:\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/doctolib/app/assets/javascripts/hooks/useToast.tsx\n\nTool results:\n\n  → result (ok): 1\timport type { ReactNode, ReactElement, ComponentType } from 'react'\n2\timport { useRef, useState, useEffect, useContext, useCallback, useMemo } from 'react'\n3\timport type { ToastProps } from 'monolith_DEPRECATED/components/base/Toast'\n4\timport { ToastContext, ToastEntriesContext } from '@doctolib/shared_context'\n5\timport useFlashMessages from 'hooks/useFlashMessages'\n6\timport { GLOBAL_PUBSUB_REGISTRY, usePubSub } from '@doctolib/upfront-core'\n7\t\n8\texport { ToastContext, ToastEntriesContext }\n9\t\n…(truncated, 3823 more chars)\n\nTools used:\n\n- Bash: grep -r \"import.Toast.from '@doctolib/toast'\" /Users/USER/workspace/doctolib --include=\".tsx\" --include=\".ts\" | head -20\n\nTools used:\n\n- Bash: find /Users/USER/workspace/doctolib/doctolib -name \".tsx\" -o -name \".ts\" | xargs grep -l \"from '@doctolib/toast'\" 2>/dev/null | head -10\n\nTool results:\n\n  → result (ok): /Users/USER/workspace/doctolib/doctolib-pro-desktop/src/core/flags/renderer/FlagsViewer.test.tsx:import { addToast } from '@doctolib/toast'\n/Users/USER/workspace/doctolib/doctolib-pro-desktop/src/core/flags/renderer/FlagsViewer.tsx:import { addToast } from '@doctolib/toast'\n/Users/USER/workspace/doctolib/doctolib-pro-desktop/src/core/ipc-inspector/renderer/components/EmulatorPanel.tsx:import { addToast } from '@doctolib/toast'\n/Users/USER/workspace/doctolib/doctolib-pro-desktop/src/core/ipc-insp\n…(truncated, 1883 more chars)\n\nTool results:\n\n  → result (ok): (Bash completed with no output)\n\nLet me get a concrete example from the monolith:\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/doctolib/app/assets/javascripts/contexts/doctor/desktop/tlsiServices/TlsiService.ts (1–50)\n\nTool results:\n\n  → result (ok): 1\timport { v4 as uuidv4 } from 'uuid'\n2\timport dayjs from 'dayjs'\n3\timport { envIsTest, envIsDevelopment, envIsStaging, envIsProduction } from 'packages/device/environment'\n4\timport { isElectron } from 'packages/device'\n5\timport i18n from 'services/i18n'\n6\t\n7\timport withWebPerformanceAPI from 'services/performance/web-performance-api/withWebPerformanceAPI'\n8\timport { GLOBAL_PUBSUB_REGISTRY } from '@doctolib/upfront-core'\n9\t\n10\timport ePrescriptionModel from 'models/ePrescription'\n11\timport type \n…(truncated, 1873 more chars)\n\nTools used:\n\n- Bash: grep -A 10 \"addToast({\" /Users/USER/workspace/doctolib/doctolib-pro-desktop/src/core/flags/renderer/FlagsViewer.tsx | head -30\n\nTool results:\n\n  → result (ok): addToast({ message: 'Flag key copied', uiStyle: 'success' })\n    } catch {\n      addToast({ message: 'Failed to copy', uiStyle: 'error' })\n    }\n  }, [entry.key])\n\n  return (\n    <tr className={flag-tr ${isEnabled ? 'flag-tr--on' : 'flag-tr--off'}}>\n      <td className=\"flag-td flag-td--status\">\n        <span className=\"flag-status-dot\" aria-hidden=\"true\" />\n      </td>\n      <td className=\"flag-td flag-td--key\">\n        <button type=\"button\" className=\"flag-key-btn\" onClick={handleCopy} title\n…(truncated, 676 more chars)\n\nNow let me check the package.json for the oxygen toast package to get version and import information:\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/toast/package.json\n\nTool results:\n\n  → result (ok): 1\t{\n2\t  \"name\": \"@doctolib/toast\",\n3\t  \"version\": \"1.7.11\",\n4\t  \"license\": \"Doctolib\",\n5\t  \"description\": \"Package allowing to display toasts in the Doctolib application\",\n6\t  \"type\": \"module\",\n7\t  \"sideEffects\": false,\n8\t  \"scripts\": {\n9\t    \"clean\": \"rm -rf node_modules/\",\n10\t    \"build\": \"rimraf dist/ && npm run -s sync-style-files && tsc --project tsconfig.build.json && tsc-alias --project tsconfig.build.json\",\n11\t    \"check-exports\": \"tsx ../../scripts/check-exports.ts\",\n12\t    \"lint\": \"esl\n…(truncated, 2462 more chars)\n\nTools used:\n\n- Bash: grep -A 3 \"export\" /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/Toast/index.ts\n\nTool results:\n\n  → result (ok): export { Toast } from './Toast'\n\nTools used:\n\n- Bash: grep -A 3 \"export\" /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/ToastCard/index.ts\n\nTool results:\n\n  → result (ok): export { ToastCard, type MessageProps, type ToastCardProps, type ToastUIStyle } from './ToastCard'\n\nPerfect! Now let me check for any TypeScript types definitions:\n\nTools used:\n\n- Read: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/Timer.ts\n\nTool results:\n\n  → result (ok): 1\texport class Timer {\n2\t  #timerId: null | ReturnType<typeof setTimeout> = null\n3\t\n4\t  #delay: number\n5\t\n6\t  #startTime: number | undefined\n7\t\n8\t  #remaining: number\n9\t\n10\t  #callback: () => void\n11\t\n12\t  constructor(callback: () => void, delay: number) {\n13\t    this.#startTime = undefined\n14\t    this.#delay = delay\n15\t    this.#remaining = delay\n16\t    this.#callback = callback\n17\t  }\n18\t\n19\t  reset() {\n20\t    this.#remaining = this.#delay\n21\t    this.resume()\n22\t  }\n23\t\n24\t  pause() {\n25\t    \n…(truncated, 883 more chars)\n\nPerfect! Now I have all the information I need. Let me compile a comprehensive report:\n\nToast Notification Component API Report\n\nPackage Information\n- Package Name: @doctolib/toast\n- Version: 1.7.11\n- Location: /Users/USER/workspace/doctolib/oxygen/packages/toast/\n- Repository: https://github.com/doctolib/oxygen\n\nImport Paths\n// Main exports from the package\nimport { Toast } from '@doctolib/toast'\nimport { addToast, closeToast } from '@doctolib/toast'\n\n// Internal component (less commonly used)\nimport { ToastCard, type ToastUIStyle } from '@doctolib/toast'\n\nCore Component: Toast\n\nLocation: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/Toast/Toast.tsx\n\nProps:\n{\n  defaultDuration?: ToastDuration  // 'infinite' (default) | number (milliseconds)\n  position: 'bottom-left' | 'top-left'  // Required\n}\n\nUsage Example:\nimport { Toast } from '@doctolib/toast'\n\n// In your root React component\ncreateRoot(domElement).render(\n  <ReactQueryProvider httpClient={httpClient}>\n    <DoctorDesktop />\n    <Toast defaultDuration={getEnvironment() === 'test' ? 'infinite' : 5000} position=\"bottom-left\" />\n  </ReactQueryProvider>\n)\n\nFunctions: addToast() and closeToast()\n\nLocation: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/toast.ts\n\naddToast(props: ToastProps): string\n\nTriggers a toast notification and returns a unique toast ID.\n\nProps:\ntype ToastProps = {\n  action?: Action                    // Optional primary action\n  dataWalkme?: string                // Optional WalkMe tracking attribute\n  duration?: ToastDuration           // Override default duration (number | 'infinite')\n  message?: ReactNode                // Toast message (required if no title)\n  onClose?: () => void               // Callback when toast closes\n  secondaryAction?: Action           // Optional secondary action\n  title?: string                     // Toast title (required if no message)\n  uiStyle?: ToastUIStyle            // 'info' | 'warning' | 'success' | 'error' | 'loading'\n}\n\ntype Action = {\n  dataWalkme?: string               // Optional WalkMe tracking attribute\n  label: string                     // Button text\n  onClick: MouseEventHandler        // Click handler (toast auto-closes after action)\n}\n\ntype ToastDuration = number | 'infinite'\ntype ToastUIStyle = 'info' | 'warning' | 'success' | 'error' | 'loading'\n\nUsage Examples:\n\nimport { addToast, closeToast } from '@doctolib/toast'\n\n// Simple success toast\naddToast({\n  message: 'Flag key copied',\n  uiStyle: 'success'\n})\n\n// Error toast\naddToast({\n  message: 'Failed to copy',\n  uiStyle: 'error'\n})\n\n// Toast with title and message\naddToast({\n  title: 'Hello world',\n  message: 'A wonderful toast message',\n  uiStyle: 'info'\n})\n\n// Toast with action\nconst toastId = addToast({\n  title: 'Save Changes?',\n  message: 'You have unsaved changes',\n  uiStyle: 'warning',\n  action: {\n    label: 'Save',\n    onClick: (e) => {\n      // Handle save\n      console.log('Save clicked')\n    }\n  },\n  secondaryAction: {\n    label: 'Discard',\n    onClick: (e) => {\n      // Handle discard\n    }\n  }\n})\n\n// Toast with duration override\naddToast({\n  message: 'This will auto-dismiss',\n  uiStyle: 'info',\n  duration: 3000  // 3 seconds\n})\n\n// Toast with callback\naddToast({\n  message: 'Processing complete',\n  uiStyle: 'success',\n  onClose: () => {\n    console.log('Toast was closed')\n  }\n})\n\n// Loading toast\naddToast({\n  title: 'Processing',\n  uiStyle: 'loading'\n})\n\ncloseToast(id: string): void\n\nProgrammatically close a toast by its ID.\n\nconst toastId = addToast({ message: 'Processing...', uiStyle: 'loading' })\n\n// Later, close it\ncloseToast(toastId)\n\nToast UI Styles\n\nEach style has associated icons and colors:\n\n| Style | Icon | Color | Use Case |\n|-------|------|-------|----------|\n| info | SquareInfoSolidIcon | primary-090 | Informational messages |\n| warning | TriangleExclamationSolidIcon | warning-090 | Warning messages |\n| success | CircleCheckSolidIcon | success-110 | Success confirmations |\n| error | DiamondExclamationSolidIcon | error-090 | Error messages (role=\"alert\") |\n| loading | SpinnerLoader | blue | Loading states |\n\nNote: Error toasts automatically have role=\"alert\" for accessibility. Other toasts use role=\"status\".\n\nImportant Features\n\n1. Duplicate Error Prevention: Duplicate error toasts with identical messages are automatically prevented.\n\n2. Accessibility:\n   - Toast container has aria-hidden attribute removed to ensure toasts are read by screen readers\n   - Error toasts use role=\"alert\"\n   - Other toasts use role=\"status\"\n   - Title and message are associated with close button via aria-describedby\n\n3. Timer Management:\n   - Toasts pause their auto-dismiss timer on mouse enter\n   - Toasts resume timer on mouse leave\n   - In test environments, timers don't auto-dismiss\n\n4. Action Behavior: When an action button is clicked, the toast automatically closes and the onClose callback is executed after the action handler.\n\n5. Portal Rendering: Toasts are rendered via React Portal directly to document.body\n\nMonolith Usage Examples\n\nLocation: /Users/USER/workspace/doctolib/doctolib-pro-desktop/src/core/flags/renderer/FlagsViewer.tsx\n\n// Success toast\naddToast({ message: 'Flag key copied', uiStyle: 'success' })\n\n// Error toast\naddToast({ message: 'Failed to copy', uiStyle: 'error' })\n\n// Info toast with dynamic message\naddToast({ message: ${Object.keys(flags).length} flags refreshed, uiStyle: 'success' })\n\nSetup Checklist\n\n1. Install: npm install @doctolib/toast\n2. Add <Toast /> component at the root level of your React app\n3. Specify required position prop ('bottom-left' or 'top-left')\n4. Optionally set defaultDuration (defaults to 'infinite')\n5. Call addToast() from anywhere in your app to trigger notifications\n6. Optionally use closeToast(id) to programmatically dismiss toasts\n\nRelated Files\n\n- Component implementation: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/Toast/Toast.tsx\n- Card/UI component: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/components/ToastCard/ToastCard.tsx\n- Business logic: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/ToastQueue.ts\n- Toast triggering: /Users/USER/workspace/doctolib/oxygen/packages/toast/src/business/toast.ts\n- Documentation: /Users/USER/workspace/doctolib/oxygen/packages/core/src/feedbacks/Toast.mdx",
  "sha256": "12687472bd37eba6",
  "source_url": "sessions/doctolib-doctolib/2026-04-22T08-58-doctolib-doctolib-you-are-a-senior-functional-ullman-subagent-a8d3350b.html"
}