{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "fine-tuning-job-monitor",
  "title": "Fine Tuning Job Monitor",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/fine-tuning-job-monitor/FineTuningJobMonitor.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  Activity,\n  AlertCircle,\n  Bot,\n  Check,\n  CheckCircle2,\n  Clock,\n  Copy,\n  Cpu,\n  Database,\n  Download,\n  Gauge,\n  Loader2,\n  Rocket,\n  Save,\n  ShieldCheck,\n  Sliders,\n  Sparkles,\n  TrendingDown,\n  XCircle,\n} from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Progress } from '@/components/ui/progress'\nimport { Separator } from '@/components/ui/separator'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\n\nexport interface CheckpointRecord {\n  id: string\n  epoch: number\n  step: number\n  totalSteps: number\n  trainLoss: number\n  valLoss: number\n  size: string\n  filename: string\n  createdAgo: string\n  isBest?: boolean\n  status: 'saved' | 'best' | 'evaluating'\n}\n\nexport interface LossReading {\n  step: number\n  trainLoss: number\n  valLoss?: number\n  isProjected?: boolean\n  label?: string\n}\n\nexport interface FineTuningJobMonitorProps extends React.HTMLAttributes<HTMLDivElement> {\n  jobId?: string\n  baseModel?: string\n  fineTunedModelName?: string\n  status?: string\n  currentEpoch?: number\n  totalEpochs?: number\n  progressPercent?: number\n  currentStep?: number\n  totalSteps?: number\n  trainingLoss?: number\n  initialLoss?: number\n  validationLoss?: number\n  learningRate?: string\n  gpuCluster?: string\n  gpuUtilization?: number\n  vramUsage?: string\n  tokensPerSec?: number\n  elapsedTime?: string\n  etaRemaining?: string\n  trainingDataset?: string\n  trainingExamples?: number\n  validationExamples?: number\n  totalTokens?: string\n  batchSize?: number\n  microBatchSize?: number\n  gradAccumSteps?: number\n  contextLength?: number\n  optimizer?: string\n  loraRank?: number\n  loraAlpha?: number\n  loraDropout?: number\n  checkpoints?: CheckpointRecord[]\n  lossData?: LossReading[]\n}\n\nconst defaultLossData: LossReading[] = [\n  { step: 0, trainLoss: 1.84, valLoss: 1.92, label: 'Init' },\n  { step: 25, trainLoss: 1.32, valLoss: undefined },\n  { step: 50, trainLoss: 0.95, valLoss: 1.02, label: 'Warmup Done' },\n  { step: 75, trainLoss: 0.915, valLoss: undefined },\n  { step: 100, trainLoss: 0.892, valLoss: 0.945, label: 'Epoch 1 (Ckpt #1)' },\n  { step: 125, trainLoss: 0.79, valLoss: undefined },\n  { step: 150, trainLoss: 0.71, valLoss: 0.748, label: 'Step 150' },\n  { step: 175, trainLoss: 0.64, valLoss: undefined },\n  { step: 200, trainLoss: 0.584, valLoss: 0.612, label: 'Epoch 2 (Ckpt #2)' },\n  { step: 225, trainLoss: 0.535, valLoss: undefined },\n  { step: 250, trainLoss: 0.495, valLoss: 0.52, label: 'Step 250' },\n  { step: 275, trainLoss: 0.46, valLoss: undefined },\n  { step: 300, trainLoss: 0.435, valLoss: 0.468, label: 'Epoch 3 (Ckpt #3)' },\n  { step: 320, trainLoss: 0.412, valLoss: 0.458, label: 'Step 320 (Live)' },\n  // Projected points\n  { step: 360, trainLoss: 0.395, valLoss: undefined, isProjected: true },\n  { step: 400, trainLoss: 0.38, valLoss: 0.415, isProjected: true, label: 'Epoch 4 (Proj)' },\n  { step: 450, trainLoss: 0.365, valLoss: undefined, isProjected: true },\n  { step: 500, trainLoss: 0.355, valLoss: 0.39, isProjected: true, label: 'Epoch 5 (Target)' },\n]\n\nconst defaultCheckpoints: CheckpointRecord[] = [\n  {\n    id: 'ckpt-3',\n    epoch: 3,\n    step: 300,\n    totalSteps: 500,\n    trainLoss: 0.435,\n    valLoss: 0.468,\n    size: '1.2 GB LoRA',\n    filename: 'adapter_model_step300.safetensors',\n    createdAgo: '24m ago',\n    isBest: true,\n    status: 'best',\n  },\n  {\n    id: 'ckpt-2',\n    epoch: 2,\n    step: 200,\n    totalSteps: 500,\n    trainLoss: 0.584,\n    valLoss: 0.612,\n    size: '1.2 GB LoRA',\n    filename: 'adapter_model_step200.safetensors',\n    createdAgo: '1h 44m ago',\n    isBest: false,\n    status: 'saved',\n  },\n  {\n    id: 'ckpt-1',\n    epoch: 1,\n    step: 100,\n    totalSteps: 500,\n    trainLoss: 0.892,\n    valLoss: 0.945,\n    size: '1.2 GB LoRA',\n    filename: 'adapter_model_step100.safetensors',\n    createdAgo: '3h 02m ago',\n    isBest: false,\n    status: 'saved',\n  },\n]\n\nexport function FineTuningJobMonitor({\n  jobId = '#ft-job-2026-0842',\n  baseModel = 'Meta Llama 3.3 70B Instruct',\n  fineTunedModelName = 'llama-3.3-70b-uipkge-expert-v2',\n  status = 'Training in Progress · Epoch 3 of 5 · 64% Complete',\n  currentEpoch = 3,\n  totalEpochs = 5,\n  progressPercent = 64,\n  currentStep = 320,\n  totalSteps = 500,\n  trainingLoss = 0.412,\n  initialLoss = 1.84,\n  validationLoss = 0.458,\n  learningRate = '1.5e-5',\n  gpuCluster = '8× NVIDIA H100 80GB SXM5',\n  gpuUtilization = 100,\n  vramUsage = '76.4 GB / 80 GB',\n  tokensPerSec = 3480,\n  elapsedTime = '4h 18m 22s',\n  etaRemaining = '2h 25m',\n  trainingDataset = 'uipkge_synthetic_sfc_pairs.jsonl',\n  trainingExamples = 42500,\n  validationExamples = 4250,\n  totalTokens = '153.8M tokens',\n  batchSize = 32,\n  microBatchSize = 4,\n  gradAccumSteps = 8,\n  contextLength = 4096,\n  optimizer = 'AdamW (beta1=0.9, beta2=0.95)',\n  loraRank = 64,\n  loraAlpha = 128,\n  loraDropout = 0.05,\n  checkpoints = defaultCheckpoints,\n  lossData = defaultLossData,\n  className,\n  ...props\n}: FineTuningJobMonitorProps) {\n  const [copiedJobId, setCopiedJobId] = React.useState(false)\n  const [copiedDataset, setCopiedDataset] = React.useState(false)\n  const [isDownloadingWeights, setIsDownloadingWeights] = React.useState(false)\n  const [isCancelling, setIsCancelling] = React.useState(false)\n  const [isJobCancelled, setIsJobCancelled] = React.useState(false)\n  const [deployingCkptId, setDeployingCkptId] = React.useState<string | null>(null)\n  const [activeNotification, setActiveNotification] = React.useState<{\n    title: string\n    message: string\n    type: 'success' | 'info' | 'destructive'\n  } | null>(null)\n  const [selectedStepIndex, setSelectedStepIndex] = React.useState<number | null>(13) // Default to step 320\n\n  const showNotification = React.useCallback(\n    (title: string, message: string, type: 'success' | 'info' | 'destructive' = 'success') => {\n      setActiveNotification({ title, message, type })\n      setTimeout(() => {\n        setActiveNotification((prev) => (prev?.title === title ? null : prev))\n      }, 4000)\n    },\n    [],\n  )\n\n  const copyJobId = React.useCallback(() => {\n    if (typeof navigator !== 'undefined' && navigator.clipboard) {\n      navigator.clipboard.writeText(jobId)\n      setCopiedJobId(true)\n      setTimeout(() => {\n        setCopiedJobId(false)\n      }, 2000)\n    }\n  }, [jobId])\n\n  const copyDatasetName = React.useCallback(() => {\n    if (typeof navigator !== 'undefined' && navigator.clipboard) {\n      navigator.clipboard.writeText(trainingDataset)\n      setCopiedDataset(true)\n      setTimeout(() => {\n        setCopiedDataset(false)\n      }, 2000)\n    }\n  }, [trainingDataset])\n\n  const handleDownloadWeights = React.useCallback(() => {\n    if (isDownloadingWeights) return\n    setIsDownloadingWeights(true)\n    setTimeout(() => {\n      setIsDownloadingWeights(false)\n      showNotification(\n        'Weights Download Triggered',\n        'LoRA adapter weights (adapter_model.safetensors, 1.2 GB) download initialized with SHA-256 verification.',\n      )\n    }, 900)\n  }, [isDownloadingWeights, showNotification])\n\n  const handleCancelJob = React.useCallback(() => {\n    if (isCancelling || isJobCancelled) return\n    setIsCancelling(true)\n    setTimeout(() => {\n      setIsCancelling(false)\n      setIsJobCancelled(true)\n      showNotification(\n        'Job Cancellation Dispatched',\n        'SIGTERM gracefully sent to GPU cluster. Last checkpoint #3 preserved.',\n        'destructive',\n      )\n    }, 700)\n  }, [isCancelling, isJobCancelled, showNotification])\n\n  const handleDeployToPlayground = React.useCallback(\n    (ckpt: CheckpointRecord) => {\n      setDeployingCkptId(ckpt.id)\n      setTimeout(() => {\n        setDeployingCkptId(null)\n        showNotification(\n          'Checkpoint Deployed to Playground',\n          `Checkpoint Epoch ${ckpt.epoch} (Step ${ckpt.step}) has been loaded into the interactive testing playground with zero cold-start latency.`,\n        )\n      }, 1000)\n    },\n    [showNotification],\n  )\n\n  // SVG Telemetry Loss Curves Math\n  const svgWidth = 740\n  const padLeft = 45\n  const padRight = 695\n  const usableW = padRight - padLeft\n  const padTop = 25\n  const padBottom = 190\n  const usableH = padBottom - padTop\n\n  const mapX = React.useCallback(\n    (step: number): number => {\n      return padLeft + (step / totalSteps) * usableW\n    },\n    [totalSteps, usableW],\n  )\n\n  const mapY = React.useCallback(\n    (loss: number): number => {\n      const clamped = Math.max(0, Math.min(2.0, loss))\n      return padBottom - (clamped / 2.0) * usableH\n    },\n    [usableH],\n  )\n\n  const targetLossY = React.useMemo(() => mapY(0.4), [mapY])\n  const currentStepX = React.useMemo(() => mapX(currentStep), [mapX, currentStep])\n\n  const historicalPoints = React.useMemo(() => lossData.filter((d) => !d.isProjected), [lossData])\n\n  const projectedPoints = React.useMemo(() => {\n    const proj = lossData.filter((d) => d.isProjected)\n    const lastHist = historicalPoints[historicalPoints.length - 1]\n    return lastHist ? [lastHist, ...proj] : proj\n  }, [lossData, historicalPoints])\n\n  const trainPathHistoric = React.useMemo(() => {\n    const pts = historicalPoints\n    if (!pts.length) return ''\n    let path = `M ${mapX(pts[0].step)},${mapY(pts[0].trainLoss)}`\n    for (let i = 1; i < pts.length; i++) {\n      const prev = pts[i - 1]\n      const curr = pts[i]\n      const x0 = mapX(prev.step)\n      const y0 = mapY(prev.trainLoss)\n      const x1 = mapX(curr.step)\n      const y1 = mapY(curr.trainLoss)\n      const cx = (x0 + x1) / 2\n      path += ` C ${cx},${y0} ${cx},${y1} ${x1},${y1}`\n    }\n    return path\n  }, [historicalPoints, mapX, mapY])\n\n  const trainAreaHistoric = React.useMemo(() => {\n    const pts = historicalPoints\n    if (!pts.length) return ''\n    const firstX = mapX(pts[0].step)\n    const lastX = mapX(pts[pts.length - 1].step)\n    return `${trainPathHistoric} L ${lastX},${padBottom} L ${firstX},${padBottom} Z`\n  }, [historicalPoints, mapX, trainPathHistoric])\n\n  const trainPathProjected = React.useMemo(() => {\n    const pts = projectedPoints\n    if (!pts.length) return ''\n    let path = `M ${mapX(pts[0].step)},${mapY(pts[0].trainLoss)}`\n    for (let i = 1; i < pts.length; i++) {\n      const prev = pts[i - 1]\n      const curr = pts[i]\n      const x0 = mapX(prev.step)\n      const y0 = mapY(prev.trainLoss)\n      const x1 = mapX(curr.step)\n      const y1 = mapY(curr.trainLoss)\n      const cx = (x0 + x1) / 2\n      path += ` C ${cx},${y0} ${cx},${y1} ${x1},${y1}`\n    }\n    return path\n  }, [projectedPoints, mapX, mapY])\n\n  const valPointsHistoric = React.useMemo(\n    () => lossData.filter((d) => !d.isProjected && d.valLoss !== undefined),\n    [lossData],\n  )\n\n  const valPathHistoric = React.useMemo(() => {\n    const pts = valPointsHistoric\n    if (!pts.length) return ''\n    let path = `M ${mapX(pts[0].step)},${mapY(pts[0].valLoss!)}`\n    for (let i = 1; i < pts.length; i++) {\n      const prev = pts[i - 1]\n      const curr = pts[i]\n      const x0 = mapX(prev.step)\n      const y0 = mapY(prev.valLoss!)\n      const x1 = mapX(curr.step)\n      const y1 = mapY(curr.valLoss!)\n      const cx = (x0 + x1) / 2\n      path += ` C ${cx},${y0} ${cx},${y1} ${x1},${y1}`\n    }\n    return path\n  }, [valPointsHistoric, mapX, mapY])\n\n  const valPointsProjected = React.useMemo(() => {\n    const list = lossData.filter((d) => d.valLoss !== undefined && d.isProjected)\n    const lastValHist = valPointsHistoric[valPointsHistoric.length - 1]\n    return lastValHist ? [lastValHist, ...list] : list\n  }, [lossData, valPointsHistoric])\n\n  const valPathProjected = React.useMemo(() => {\n    const pts = valPointsProjected\n    if (!pts.length) return ''\n    let path = `M ${mapX(pts[0].step)},${mapY(pts[0].valLoss!)}`\n    for (let i = 1; i < pts.length; i++) {\n      const prev = pts[i - 1]\n      const curr = pts[i]\n      const x0 = mapX(prev.step)\n      const y0 = mapY(prev.valLoss!)\n      const x1 = mapX(curr.step)\n      const y1 = mapY(curr.valLoss!)\n      const cx = (x0 + x1) / 2\n      path += ` C ${cx},${y0} ${cx},${y1} ${x1},${y1}`\n    }\n    return path\n  }, [valPointsProjected, mapX, mapY])\n\n  return (\n    <div data-slot=\"fine-tuning-job-monitor\" className={cn('mx-auto w-full max-w-6xl space-y-6', className)} {...props}>\n      {/* Header Section */}\n      <div className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n        <div className=\"space-y-1.5\">\n          <div className=\"flex flex-wrap items-center gap-2.5\">\n            <div className=\"flex items-center gap-2.5\">\n              <div className=\"border-info/30 bg-info/10 text-info text-info flex size-10 items-center justify-center rounded-xl border shadow-xs\">\n                <Bot className=\"size-5\" />\n              </div>\n              <div>\n                <div className=\"flex flex-wrap items-center gap-2\">\n                  <h1 className=\"text-foreground font-mono text-xl font-bold tracking-tight break-all sm:text-2xl\">\n                    {fineTunedModelName}\n                  </h1>\n                  <button\n                    type=\"button\"\n                    className=\"bg-muted hover:bg-muted/80 text-muted-foreground hover:text-foreground border-border/80 inline-flex min-h-6 items-center gap-1 rounded-md border px-2 py-0.5 font-mono text-xs transition-colors\"\n                    title={`Copy Job ID: ${jobId}`}\n                    onClick={copyJobId}\n                  >\n                    <span className=\"text-foreground font-medium\">{jobId}</span>\n                    {copiedJobId ? <Check className=\"text-success size-3\" /> : <Copy className=\"size-3 opacity-70\" />}\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div className=\"text-muted-foreground flex flex-wrap items-center gap-x-3 gap-y-1 text-xs\">\n            <div className=\"flex items-center gap-1.5\">\n              <span className=\"text-muted-foreground\">Base Model:</span>\n              <span className=\"text-foreground font-medium\">{baseModel}</span>\n            </div>\n            <span>·</span>\n            {/* Live Status Badge */}\n            <div className=\"flex items-center gap-1.5\">\n              {!isJobCancelled ? (\n                <span className=\"relative flex size-2\">\n                  <span className=\"bg-info absolute inline-flex h-full w-full rounded-full opacity-75\" />\n                  <span className=\"bg-info relative inline-flex size-2 rounded-full\" />\n                </span>\n              ) : (\n                <span className=\"bg-destructive size-2 rounded-full\" />\n              )}\n              <span className={cn('font-medium', isJobCancelled ? 'text-destructive' : 'text-info')}>\n                {isJobCancelled ? 'Job Cancelled by Operator' : status}\n              </span>\n            </div>\n            <span>·</span>\n            <div className=\"flex items-center gap-1\">\n              <Clock className=\"size-3.5\" />\n              <span className=\"tabular-nums\">Elapsed: {elapsedTime}</span>\n              <span className=\"text-muted-foreground\">· ETA {etaRemaining}</span>\n            </div>\n          </div>\n        </div>\n\n        {/* Action Buttons */}\n        <div className=\"flex flex-wrap items-center gap-2.5\">\n          <Button\n            variant=\"ghost\"\n            size=\"sm\"\n            disabled={isCancelling || isJobCancelled}\n            className=\"text-muted-foreground hover:bg-destructive/10 hover:text-destructive h-8.5 gap-1.5 text-xs font-medium\"\n            onClick={handleCancelJob}\n          >\n            <XCircle className={cn('size-3.5', isCancelling && 'animate-spin')} />\n            <span>{isJobCancelled ? 'Cancelled' : isCancelling ? 'Cancelling...' : 'Cancel Job'}</span>\n          </Button>\n\n          <Button\n            aria-label=\"Download attachment\"\n            variant=\"default\"\n            size=\"sm\"\n            disabled={isDownloadingWeights}\n            className=\"h-8.5 gap-2 text-xs font-medium shadow-xs\"\n            onClick={handleDownloadWeights}\n          >\n            <Download className={cn('size-3.5', isDownloadingWeights && 'animate-bounce')} />\n            <span>{isDownloadingWeights ? 'Preparing Archive...' : 'Download Weights / LoRA Adapter'}</span>\n          </Button>\n        </div>\n      </div>\n\n      {/* Notification Toast Banner */}\n      {activeNotification && (\n        <div\n          className={cn(\n            'flex items-center justify-between rounded-lg border p-3 text-xs shadow-xs transition-colors',\n            activeNotification.type === 'destructive'\n              ? 'border-destructive/30 bg-destructive/10 text-destructive'\n              : 'border-border bg-card text-card-foreground',\n          )}\n          role=\"status\"\n        >\n          <div className=\"flex items-center gap-2.5\">\n            {activeNotification.type === 'success' ? (\n              <CheckCircle2 className=\"text-success size-4 shrink-0\" />\n            ) : (\n              <AlertCircle className=\"text-destructive size-4 shrink-0\" />\n            )}\n            <div>\n              <span className=\"text-foreground font-semibold\">{activeNotification.title}: </span>\n              <span className=\"text-muted-foreground\">{activeNotification.message}</span>\n            </div>\n          </div>\n          <Button\n            aria-label=\"Dismiss notification\"\n            variant=\"ghost\"\n            size=\"icon-sm\"\n            className=\"text-muted-foreground hover:text-foreground size-6\"\n            onClick={() => setActiveNotification(null)}\n          >\n            <span className=\"text-xs\">✕</span>\n          </Button>\n        </div>\n      )}\n\n      {/* 4 Training Telemetry Cards */}\n      <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        {/* 1. Current Training Loss */}\n        <Card className=\"border-border bg-card text-card-foreground shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between gap-2\">\n              <div className=\"flex min-w-0 items-center gap-2\">\n                <div className=\"border-info/20 bg-info/10 text-info flex size-8 shrink-0 items-center justify-center rounded-lg border\">\n                  <Activity className=\"size-4\" />\n                </div>\n                <CardTitle className=\"truncate text-sm font-medium\">Training Loss</CardTitle>\n              </div>\n              <Badge wrap variant=\"outline\" className=\"font-mono text-xs tabular-nums\">\n                Step {currentStep}/{totalSteps}\n              </Badge>\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-2.5 pt-1\">\n            <div className=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n              <div className=\"flex items-baseline gap-1.5\">\n                <span className=\"text-foreground font-mono text-3xl font-bold tracking-tight tabular-nums\">\n                  {trainingLoss.toFixed(3)}\n                </span>\n                <span className=\"text-muted-foreground text-xs font-normal\">cross-entropy</span>\n              </div>\n              <div className=\"text-success flex items-center gap-1 text-xs font-semibold\">\n                <TrendingDown className=\"size-3.5\" />\n                <span className=\"tabular-nums\">-77.6%</span>\n              </div>\n            </div>\n\n            <div className=\"border-border/60 border-t pt-2 text-xs\">\n              <div className=\"text-muted-foreground flex flex-wrap items-center justify-between gap-x-2 gap-y-0.5\">\n                <span>Initial Loss:</span>\n                <span className=\"text-foreground font-mono font-medium tabular-nums\">{initialLoss.toFixed(3)}</span>\n              </div>\n              <p className=\"text-muted-foreground mt-0.5 text-xs\">Target convergence corridor: &lt; 0.450</p>\n            </div>\n          </CardContent>\n        </Card>\n\n        {/* 2. Validation Loss */}\n        <Card className=\"border-border bg-card text-card-foreground shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between gap-2\">\n              <div className=\"flex min-w-0 items-center gap-2\">\n                <div className=\"border-success/20 bg-success/10 text-success flex size-8 shrink-0 items-center justify-center rounded-lg border\">\n                  <ShieldCheck className=\"size-4\" />\n                </div>\n                <CardTitle className=\"truncate text-sm font-medium\">Validation Loss</CardTitle>\n              </div>\n              <Badge wrap variant=\"success\" className=\"shrink-0 text-xs\">\n                Generalizing\n              </Badge>\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-2.5 pt-1\">\n            <div className=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n              <div className=\"flex items-baseline gap-1.5\">\n                <span className=\"text-foreground font-mono text-3xl font-bold tracking-tight tabular-nums\">\n                  {validationLoss.toFixed(3)}\n                </span>\n                <span className=\"text-muted-foreground text-xs font-normal\">eval set</span>\n              </div>\n              <span className=\"text-success text-success text-xs font-medium tabular-nums\">+0.046 gap</span>\n            </div>\n\n            <div className=\"border-border/60 border-t pt-2 text-xs\">\n              <div className=\"text-muted-foreground flex items-center justify-between gap-x-2\">\n                <span>Overfitting Status:</span>\n                <span className=\"text-success font-medium\">No Overfitting</span>\n              </div>\n              <p className=\"text-muted-foreground mt-0.5 text-xs\">Evaluated every 50 steps on 4,250 rows</p>\n            </div>\n          </CardContent>\n        </Card>\n\n        {/* 3. Learning Rate */}\n        <Card className=\"border-border bg-card text-card-foreground shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between gap-2\">\n              <div className=\"flex min-w-0 items-center gap-2\">\n                <div className=\"border-chart-1/20 bg-chart-1/10 text-chart-1 flex size-8 shrink-0 items-center justify-center rounded-lg border\">\n                  <Gauge className=\"size-4\" />\n                </div>\n                <CardTitle className=\"truncate text-sm font-medium\">Learning Rate</CardTitle>\n              </div>\n              <Badge wrap variant=\"outline\" className=\"shrink-0 font-mono text-xs\">\n                Cosine\n              </Badge>\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-2.5 pt-1\">\n            <div className=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n              <div className=\"flex items-baseline gap-1.5\">\n                <span className=\"text-foreground font-mono text-3xl font-bold tracking-tight tabular-nums\">\n                  {learningRate}\n                </span>\n                <span className=\"text-muted-foreground text-xs font-normal\">AdamW</span>\n              </div>\n              <span className=\"text-muted-foreground text-xs font-medium tabular-nums\">Decay active</span>\n            </div>\n\n            <div className=\"border-border/60 border-t pt-2 text-xs\">\n              <div className=\"text-muted-foreground flex items-center justify-between gap-x-2\">\n                <span>Schedule:</span>\n                <span className=\"text-foreground font-medium\">Cosine Decay (10% warmup)</span>\n              </div>\n              <p className=\"text-muted-foreground mt-0.5 text-xs\">Peak: 1.5e-4 · Min: 1.0e-6</p>\n            </div>\n          </CardContent>\n        </Card>\n\n        {/* 4. GPU Compute Cluster */}\n        <Card className=\"border-border bg-card text-card-foreground shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between gap-2\">\n              <div className=\"flex min-w-0 items-center gap-2\">\n                <div className=\"border-warning/20 bg-warning/10 text-warning flex size-8 shrink-0 items-center justify-center rounded-lg border\">\n                  <Cpu className=\"size-4\" />\n                </div>\n                <CardTitle className=\"truncate text-sm font-medium\">GPU Compute Cluster</CardTitle>\n              </div>\n              <Badge wrap variant=\"success\" className=\"shrink-0 text-xs tabular-nums\">\n                {gpuUtilization}% Utilized\n              </Badge>\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-2.5 pt-1\">\n            <div className=\"flex flex-wrap items-baseline justify-between gap-x-2 gap-y-0.5\">\n              <div>\n                <span className=\"text-foreground text-lg font-bold tracking-tight sm:text-xl\">{gpuCluster}</span>\n              </div>\n            </div>\n\n            <div className=\"space-y-1\">\n              <Progress value={gpuUtilization} className=\"[&_[data-slot=progress-indicator]]:bg-success h-1.5\" />\n              <div className=\"text-muted-foreground flex items-center justify-between gap-x-2 text-xs\">\n                <span>\n                  VRAM: <span className=\"text-foreground font-mono font-medium tabular-nums\">{vramUsage}</span>\n                </span>\n                <span className=\"font-mono tabular-nums\">{tokensPerSec.toLocaleString()} tok/s</span>\n              </div>\n            </div>\n          </CardContent>\n        </Card>\n      </div>\n\n      {/* Training & Validation Loss SVG Trend Curve */}\n      <Card className=\"border-border bg-card text-card-foreground shadow-xs\">\n        <CardHeader className=\"pb-3\">\n          <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n            <div className=\"space-y-1\">\n              <div className=\"flex items-center gap-2\">\n                <Activity className=\"text-primary size-4\" />\n                <CardTitle className=\"text-base font-semibold\">Training & Validation Loss Convergence</CardTitle>\n              </div>\n              <CardDescription className=\"text-xs\">\n                Dual-series loss trajectory across {totalSteps} gradient steps. Solid lines represent observed loss;\n                dashed lines denote projected cosine decay trajectory.\n              </CardDescription>\n            </div>\n\n            {/* Legend & Metrics */}\n            <div className=\"flex flex-wrap items-center gap-3\">\n              <div className=\"text-muted-foreground flex flex-wrap items-center gap-3 text-xs\">\n                <div className=\"flex items-center gap-1.5\">\n                  <span className=\"bg-info size-2.5 rounded-full\" />\n                  <span className=\"text-foreground font-medium\">Training Loss ({trainingLoss.toFixed(3)})</span>\n                </div>\n                <div className=\"flex items-center gap-1.5\">\n                  <span className=\"bg-success size-2.5 rounded-full\" />\n                  <span className=\"text-foreground font-medium\">Validation Loss ({validationLoss.toFixed(3)})</span>\n                </div>\n                <div className=\"flex items-center gap-1.5\">\n                  <span className=\"border-destructive bg-destructive h-0.5 w-3 border-b border-dashed\" />\n                  <span className=\"text-muted-foreground\">Target (&lt; 0.400)</span>\n                </div>\n              </div>\n            </div>\n          </div>\n        </CardHeader>\n\n        <CardContent className=\"space-y-4\">\n          {/* SVG Chart Canvas Area */}\n          <div className=\"bg-muted/20 border-border/60 relative w-full overflow-x-auto rounded-lg border p-2 sm:p-4\">\n            <svg\n              className=\"h-64 w-full max-w-[600px] min-w-full\"\n              viewBox={`0 0 ${svgWidth} 220`}\n              preserveAspectRatio=\"none\"\n            >\n              <defs>\n                <linearGradient id=\"grad-train-loss-react\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n                  <stop offset=\"0%\" stopColor=\"var(--color-sky-500, #0ea5e9)\" stopOpacity=\"0.28\" />\n                  <stop offset=\"100%\" stopColor=\"var(--color-sky-500, #0ea5e9)\" stopOpacity=\"0.0\" />\n                </linearGradient>\n              </defs>\n\n              {/* Shaded Target Convergence Zone (Loss 0.00 to 0.40 -> Y: 190 to 157) */}\n              <rect\n                x={padLeft}\n                y={targetLossY}\n                width={usableW}\n                height={padBottom - targetLossY}\n                fill=\"var(--color-emerald-500, #10b981)\"\n                fillOpacity=\"0.05\"\n                rx=\"4\"\n              />\n\n              {/* Horizontal Grid Lines */}\n              <line\n                x1={padLeft}\n                y1=\"25\"\n                x2={padRight}\n                y2=\"25\"\n                stroke=\"currentColor\"\n                className=\"text-border/40\"\n                strokeWidth=\"1\"\n              />\n              <line\n                x1={padLeft}\n                y1=\"66\"\n                x2={padRight}\n                y2=\"66\"\n                stroke=\"currentColor\"\n                className=\"text-border/40\"\n                strokeWidth=\"1\"\n              />\n              <line\n                x1={padLeft}\n                y1=\"107\"\n                x2={padRight}\n                y2=\"107\"\n                stroke=\"currentColor\"\n                className=\"text-border/40\"\n                strokeWidth=\"1\"\n              />\n              <line\n                x1={padLeft}\n                y1=\"148\"\n                x2={padRight}\n                y2=\"148\"\n                stroke=\"currentColor\"\n                className=\"text-border/40\"\n                strokeWidth=\"1\"\n              />\n              <line\n                x1={padLeft}\n                y1={targetLossY}\n                x2={padRight}\n                y2={targetLossY}\n                stroke=\"var(--color-rose-500, #f43f5e)\"\n                strokeWidth=\"1.5\"\n                strokeDasharray=\"4 4\"\n              />\n              <line\n                x1={padLeft}\n                y1={padBottom}\n                x2={padRight}\n                y2={padBottom}\n                stroke=\"currentColor\"\n                className=\"text-border/40\"\n                strokeWidth=\"1\"\n              />\n\n              {/* Y-Axis Scale Labels */}\n              <text x={padLeft - 8} y=\"29\" textAnchor=\"end\" className=\"fill-muted-foreground font-mono text-xs\">\n                2.00\n              </text>\n              <text x={padLeft - 8} y=\"70\" textAnchor=\"end\" className=\"fill-muted-foreground font-mono text-xs\">\n                1.50\n              </text>\n              <text x={padLeft - 8} y=\"111\" textAnchor=\"end\" className=\"fill-muted-foreground font-mono text-xs\">\n                1.00\n              </text>\n              <text x={padLeft - 8} y=\"152\" textAnchor=\"end\" className=\"fill-muted-foreground font-mono text-xs\">\n                0.50\n              </text>\n              <text\n                x={padLeft - 8}\n                y={targetLossY + 4}\n                textAnchor=\"end\"\n                className=\"fill-destructive font-mono text-xs font-semibold\"\n              >\n                0.40\n              </text>\n              <text\n                x={padLeft - 8}\n                y={padBottom + 4}\n                textAnchor=\"end\"\n                className=\"fill-muted-foreground font-mono text-xs\"\n              >\n                0.00\n              </text>\n\n              {/* Current Step 320 Vertical Indicator Line */}\n              <line\n                x1={currentStepX}\n                y1=\"20\"\n                x2={currentStepX}\n                y2={padBottom}\n                stroke=\"var(--color-sky-500, #0ea5e9)\"\n                strokeWidth=\"1.5\"\n                strokeDasharray=\"2 3\"\n              />\n\n              {/* Training Loss Area & Solid Line (Observed) */}\n              <path d={trainAreaHistoric} fill=\"url(#grad-train-loss-react)\" />\n              <path\n                d={trainPathHistoric}\n                fill=\"none\"\n                stroke=\"var(--color-sky-500, #0ea5e9)\"\n                strokeWidth=\"2.5\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n              />\n\n              {/* Training Loss Projected Line (Dashed) */}\n              <path\n                d={trainPathProjected}\n                fill=\"none\"\n                stroke=\"var(--color-sky-500, #0ea5e9)\"\n                strokeWidth=\"2\"\n                strokeDasharray=\"4 4\"\n                strokeOpacity=\"0.6\"\n                strokeLinecap=\"round\"\n              />\n\n              {/* Validation Loss Curve (Observed Solid Emerald) */}\n              <path\n                d={valPathHistoric}\n                fill=\"none\"\n                stroke=\"var(--color-emerald-500, #10b981)\"\n                strokeWidth=\"2.5\"\n                strokeLinecap=\"round\"\n                strokeLinejoin=\"round\"\n              />\n\n              {/* Validation Loss Projected Line (Dashed Emerald) */}\n              <path\n                d={valPathProjected}\n                fill=\"none\"\n                stroke=\"var(--color-emerald-500, #10b981)\"\n                strokeWidth=\"2\"\n                strokeDasharray=\"4 4\"\n                strokeOpacity=\"0.6\"\n                strokeLinecap=\"round\"\n              />\n\n              {/* Validation Loss Checkpoint Nodes (Observed) */}\n              {valPointsHistoric.map((pt) => (\n                <circle\n                  key={`val-${pt.step}`}\n                  cx={mapX(pt.step)}\n                  cy={mapY(pt.valLoss!)}\n                  r={4}\n                  className=\"stroke-background fill-success cursor-pointer stroke-2 transition-transform hover:scale-125\"\n                  onMouseEnter={() => setSelectedStepIndex(lossData.findIndex((d) => d.step === pt.step))}\n                />\n              ))}\n\n              {/* Training Loss Interactive Point Markers */}\n              {historicalPoints.map((pt, idx) => (\n                <circle\n                  key={`train-${pt.step}`}\n                  cx={mapX(pt.step)}\n                  cy={mapY(pt.trainLoss)}\n                  r={pt.step === currentStep ? 5 : 3}\n                  className={cn(\n                    'stroke-background cursor-pointer stroke-2 transition-transform hover:scale-150',\n                    pt.step === currentStep ? 'fill-info ring-info ring-2' : 'fill-info',\n                  )}\n                  onMouseEnter={() => setSelectedStepIndex(idx)}\n                />\n              ))}\n\n              {/* Current Step Marker Pin Top Flag */}\n              <g transform={`translate(${currentStepX - 44}, 10)`}>\n                <rect width=\"88\" height=\"18\" rx=\"4\" className=\"dark:fill-info fill-sky-600\" />\n                <text x=\"44\" y=\"13\" textAnchor=\"middle\" className=\"fill-white font-mono text-xs font-semibold\">\n                  Step 320 / 500\n                </text>\n              </g>\n            </svg>\n\n            {/* X-Axis Step Milestones */}\n            <div className=\"mt-2 grid grid-cols-2 gap-2 text-xs sm:grid-cols-4 lg:grid-cols-7\">\n              {lossData\n                .filter((d) => d.label)\n                .map((pt, idx) => {\n                  const isSelected = selectedStepIndex === lossData.indexOf(pt)\n                  return (\n                    <div\n                      key={idx}\n                      className={cn(\n                        'rounded p-1.5 text-center transition-colors',\n                        isSelected\n                          ? 'border-border/80 bg-muted border shadow-2xs'\n                          : 'bg-muted/30 border border-transparent',\n                      )}\n                    >\n                      <p className=\"text-foreground font-mono text-xs font-semibold tabular-nums\">Step {pt.step}</p>\n                      <p className=\"text-muted-foreground truncate text-xs\">{pt.label}</p>\n                      <div className=\"mt-0.5 flex items-center justify-center gap-1 font-mono text-xs tabular-nums\">\n                        <span className=\"text-info\">{pt.trainLoss.toFixed(3)}</span>\n                        {pt.valLoss && <span className=\"text-success\">/ {pt.valLoss.toFixed(3)}</span>}\n                      </div>\n                    </div>\n                  )\n                })}\n            </div>\n          </div>\n\n          {/* Metric Summary Strip */}\n          <div className=\"grid grid-cols-2 gap-3 text-xs sm:grid-cols-3 lg:grid-cols-5\">\n            <div className=\"border-border bg-muted/30 rounded-lg border p-2.5\">\n              <span className=\"text-muted-foreground\">Step Progress</span>\n              <p className=\"text-foreground font-mono text-sm font-semibold tabular-nums\">\n                {currentStep} / {totalSteps} ({progressPercent}%)\n              </p>\n              <div className=\"mt-1\">\n                <Progress value={progressPercent} className=\"[&_[data-slot=progress-indicator]]:bg-info h-1\" />\n              </div>\n            </div>\n\n            <div className=\"border-border bg-muted/30 rounded-lg border p-2.5\">\n              <span className=\"text-muted-foreground\">Tokens Processed</span>\n              <p className=\"text-foreground font-mono text-sm font-semibold tabular-nums\">98.4M / 153.8M</p>\n              <span className=\"text-muted-foreground text-xs\">64.0% of corpus</span>\n            </div>\n\n            <div className=\"border-border bg-muted/30 rounded-lg border p-2.5\">\n              <span className=\"text-muted-foreground\">Cluster Throughput</span>\n              <p className=\"text-foreground font-mono text-sm font-semibold tabular-nums\">\n                {tokensPerSec.toLocaleString()} tok/s\n              </p>\n              <span className=\"text-success text-xs font-medium\">Zero pipeline bubbles</span>\n            </div>\n\n            <div className=\"border-border bg-muted/30 rounded-lg border p-2.5\">\n              <span className=\"text-muted-foreground\">Current Epoch</span>\n              <p className=\"text-foreground font-mono text-sm font-semibold tabular-nums\">\n                Epoch {currentEpoch} of {totalEpochs}\n              </p>\n              <span className=\"text-muted-foreground text-xs\">100 steps / epoch</span>\n            </div>\n\n            <div className=\"border-border bg-muted/30 col-span-2 rounded-lg border p-2.5 sm:col-span-3 lg:col-span-1\">\n              <span className=\"text-muted-foreground\">Convergence Projection</span>\n              <p className=\"text-success text-success font-mono text-sm font-semibold tabular-nums\">\n                0.355 at Step 500\n              </p>\n              <span className=\"text-muted-foreground text-xs\">Expected final loss</span>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* Lower Section: Checkpoint History & Hyperparameters Configuration */}\n      <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n        {/* Left Column (2 cols on lg): Checkpoint History Table */}\n        <Card className=\"border-border bg-card text-card-foreground shadow-xs lg:col-span-2\">\n          <CardHeader className=\"pb-3\">\n            <div className=\"flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between\">\n              <div className=\"space-y-0.5\">\n                <div className=\"flex items-center gap-2\">\n                  <Save className=\"text-primary size-4\" />\n                  <CardTitle className=\"text-base font-semibold\">Checkpoint History & Weight Exporter</CardTitle>\n                </div>\n                <CardDescription className=\"text-xs\">\n                  Saved LoRA adapter snapshots. Deploy directly to test playground or download safe tensors.\n                </CardDescription>\n              </div>\n              <Badge wrap variant=\"outline\" className=\"w-fit font-mono text-xs font-normal tabular-nums\">\n                {checkpoints.length} Saved Snapshots\n              </Badge>\n            </div>\n          </CardHeader>\n          <CardContent className=\"p-0 sm:p-6 sm:pt-0\">\n            <div className=\"overflow-x-auto\">\n              <Table>\n                <TableHeader>\n                  <TableRow>\n                    <TableHead className=\"min-w-[140px] text-xs\">Checkpoint</TableHead>\n                    <TableHead className=\"min-w-[80px] text-xs\">Step</TableHead>\n                    <TableHead className=\"min-w-[90px] text-xs\">Train Loss</TableHead>\n                    <TableHead className=\"min-w-[90px] text-xs\">Val Loss</TableHead>\n                    <TableHead className=\"min-w-[110px] text-xs\">Size & Type</TableHead>\n                    <TableHead className=\"min-w-[100px] text-xs\">Created</TableHead>\n                    <TableHead className=\"min-w-[150px] text-right text-xs\">Actions</TableHead>\n                  </TableRow>\n                </TableHeader>\n                <TableBody>\n                  {checkpoints.map((ckpt) => (\n                    <TableRow key={ckpt.id} className={ckpt.isBest ? 'bg-success/[0.04]' : ''}>\n                      <TableCell className=\"text-xs whitespace-nowrap\">\n                        <div className=\"space-y-0.5\">\n                          <div className=\"flex items-center gap-1.5\">\n                            <span className=\"text-foreground font-mono font-medium\">Epoch {ckpt.epoch}.0</span>\n                            {ckpt.isBest && (\n                              <Badge wrap variant=\"success\" className=\"h-4 px-1.5 text-xs font-medium\">\n                                Best Val Loss\n                              </Badge>\n                            )}\n                          </div>\n                          <p className=\"text-muted-foreground font-mono text-xs\">{ckpt.filename}</p>\n                        </div>\n                      </TableCell>\n                      <TableCell className=\"font-mono text-xs whitespace-nowrap tabular-nums\">\n                        {ckpt.step} / {ckpt.totalSteps}\n                      </TableCell>\n                      <TableCell className=\"text-xs whitespace-nowrap\">\n                        <span className=\"text-info text-info font-mono font-semibold tabular-nums\">\n                          {ckpt.trainLoss.toFixed(3)}\n                        </span>\n                      </TableCell>\n                      <TableCell className=\"text-xs whitespace-nowrap\">\n                        <span className=\"text-success text-success font-mono font-semibold tabular-nums\">\n                          {ckpt.valLoss.toFixed(3)}\n                        </span>\n                      </TableCell>\n                      <TableCell className=\"text-muted-foreground font-mono text-xs whitespace-nowrap tabular-nums\">\n                        {ckpt.size}\n                      </TableCell>\n                      <TableCell className=\"text-muted-foreground text-xs whitespace-nowrap\">\n                        {ckpt.createdAgo}\n                      </TableCell>\n                      <TableCell className=\"text-right whitespace-nowrap\">\n                        <div className=\"flex items-center justify-end gap-1.5\">\n                          <Button\n                            variant=\"outline\"\n                            size=\"xs\"\n                            disabled={deployingCkptId === ckpt.id}\n                            className=\"gap-1 text-xs\"\n                            onClick={() => handleDeployToPlayground(ckpt)}\n                          >\n                            {deployingCkptId === ckpt.id ? (\n                              <Loader2 className=\"size-3 animate-spin\" />\n                            ) : (\n                              <Rocket className=\"text-info size-3\" />\n                            )}\n                            <span>{deployingCkptId === ckpt.id ? 'Deploying...' : 'Deploy to Playground'}</span>\n                          </Button>\n                          <Button\n                            variant=\"ghost\"\n                            size=\"icon-xs\"\n                            className=\"text-muted-foreground hover:text-foreground size-7\"\n                            title=\"Download LoRA .safetensors\"\n                            onClick={handleDownloadWeights}\n                          >\n                            <Download className=\"size-3.5\" />\n                          </Button>\n                        </div>\n                      </TableCell>\n                    </TableRow>\n                  ))}\n                </TableBody>\n              </Table>\n            </div>\n          </CardContent>\n        </Card>\n\n        {/* Right Column (1 col on lg): Hyperparameters & Dataset Configuration Card */}\n        <Card className=\"border-border bg-card text-card-foreground shadow-xs lg:col-span-1\">\n          <CardHeader className=\"pb-3\">\n            <div className=\"flex items-center justify-between gap-x-2\">\n              <div className=\"flex items-center gap-2\">\n                <Sliders className=\"text-primary size-4\" />\n                <CardTitle className=\"text-base font-semibold\">Hyperparameters & Dataset</CardTitle>\n              </div>\n              <Badge wrap variant=\"outline\" className=\"font-mono text-xs\">\n                LoRA PEFT\n              </Badge>\n            </div>\n            <CardDescription className=\"text-xs\">\n              Fine-tuning recipe manifest and dataset partition metadata.\n            </CardDescription>\n          </CardHeader>\n          <CardContent className=\"space-y-4\">\n            {/* Training Dataset Box */}\n            <div className=\"border-border/80 bg-muted/40 space-y-2 rounded-lg border p-3 text-xs\">\n              <div className=\"flex items-center justify-between gap-x-2\">\n                <div className=\"flex items-center gap-1.5\">\n                  <Database className=\"text-primary size-3.5\" />\n                  <span className=\"text-foreground font-semibold\">Training Dataset</span>\n                </div>\n                <button\n                  type=\"button\"\n                  className=\"text-muted-foreground hover:text-foreground transition-colors\"\n                  title=\"Copy dataset filename\"\n                  onClick={copyDatasetName}\n                >\n                  {copiedDataset ? <Check className=\"text-success size-3\" /> : <Copy className=\"size-3\" />}\n                </button>\n              </div>\n              <p className=\"text-foreground font-mono text-xs font-medium break-all\">{trainingDataset}</p>\n              <div className=\"text-muted-foreground flex flex-wrap items-center justify-between gap-1 text-xs\">\n                <span>\n                  {trainingExamples.toLocaleString()} train · {validationExamples.toLocaleString()} val\n                </span>\n                <span className=\"font-mono tabular-nums\">{totalTokens}</span>\n              </div>\n            </div>\n\n            {/* Key Parameters Grid */}\n            <div className=\"space-y-2.5 text-xs\">\n              <div className=\"border-border/50 flex items-center justify-between gap-x-2 border-b pb-1.5\">\n                <span className=\"text-muted-foreground\">Effective Batch Size:</span>\n                <span className=\"text-foreground font-mono font-semibold tabular-nums\">\n                  {batchSize}{' '}\n                  <span className=\"text-muted-foreground font-normal\">\n                    ({microBatchSize} × {gradAccumSteps} accum)\n                  </span>\n                </span>\n              </div>\n\n              <div className=\"border-border/50 flex items-center justify-between gap-x-2 border-b pb-1.5\">\n                <span className=\"text-muted-foreground\">Context Length:</span>\n                <span className=\"text-foreground font-mono font-semibold tabular-nums\">\n                  {contextLength.toLocaleString()} tokens\n                </span>\n              </div>\n\n              <div className=\"border-border/50 flex items-center justify-between gap-x-2 border-b pb-1.5\">\n                <span className=\"text-muted-foreground\">Optimizer:</span>\n                <span className=\"text-foreground font-mono font-medium\">{optimizer}</span>\n              </div>\n\n              <div className=\"border-border/50 flex items-center justify-between gap-x-2 border-b pb-1.5\">\n                <span className=\"text-muted-foreground\">LoRA Rank & Alpha:</span>\n                <span className=\"text-foreground font-mono font-semibold tabular-nums\">\n                  r={loraRank}, α={loraAlpha} (dropout={loraDropout})\n                </span>\n              </div>\n\n              <div className=\"border-border/50 flex items-center justify-between gap-x-2 border-b pb-1.5\">\n                <span className=\"text-muted-foreground\">Target Modules:</span>\n                <span className=\"text-foreground font-mono text-xs\">All Linear (q, k, v, o, gate, up, down)</span>\n              </div>\n\n              <div className=\"border-border/50 flex items-center justify-between gap-x-2 border-b pb-1.5\">\n                <span className=\"text-muted-foreground\">Precision & Kernel:</span>\n                <span className=\"text-foreground font-mono\">bfloat16 · FlashAttention-2</span>\n              </div>\n\n              <div className=\"flex items-center justify-between gap-x-2\">\n                <span className=\"text-muted-foreground\">Parallelism Strategy:</span>\n                <span className=\"text-foreground font-medium\">PyTorch FSDP-2 (Hybrid Sharded)</span>\n              </div>\n            </div>\n\n            <Separator />\n\n            {/* Export & Integration Note */}\n            <div className=\"border-border bg-muted/20 space-y-1.5 rounded-lg border p-2.5 text-xs\">\n              <div className=\"text-foreground flex items-center gap-1.5 font-medium\">\n                <Sparkles className=\"text-info size-3.5\" />\n                <span>HuggingFace Hub & vLLM Ready</span>\n              </div>\n              <p className=\"text-muted-foreground leading-relaxed\">\n                Checkpoints are stored in standard SafeTensors format with tokenizer configs ready for instant\n                serverless vLLM / TensorRT-LLM deployment.\n              </p>\n            </div>\n          </CardContent>\n        </Card>\n      </div>\n    </div>\n  )\n}\n",
      "type": "registry:block",
      "target": "~/components/blocks/FineTuningJobMonitor.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/progress.json",
    "https://uipkge.dev/r/react/separator.json",
    "https://uipkge.dev/r/react/table.json"
  ],
  "description": "LLM fine-tuning job telemetry, loss curve convergence tracking, GPU cluster utilization, hyperparameter manifests, and LoRA checkpoint exporter.",
  "categories": [
    "ai",
    "dashboard",
    "app"
  ]
}