{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "9920ccc0",
   "metadata": {},
   "source": [
    "# Beyond the Cluster Map — Demand-Driven Gap Analysis\n",
    "\n",
    "The admin console shows you the HDBSCAN cluster map: where your intents fall and\n",
    "which ones the density-based clustering grouped together. That map is powerful, but\n",
    "HDBSCAN only ever sees **one signal — the geometric density of intent embeddings**.\n",
    "That leaves it blind to three things you already have data for:\n",
    "\n",
    "| Blindness | What it misses | This notebook |\n",
    "|---|---|---|\n",
    "| **demand-blind** | a 1-hit and a 40-hit intent look identical | **§1 Rescue the hot noise** |\n",
    "| **answer-blind** | it clusters how questions are *phrased*, not what *answers* them | **§2 Cluster by answer** |\n",
    "| **corpus-blind** | it never looks at your document chunks at all | **§3 Supply / demand map** |\n",
    "\n",
    "Your users are already telling you what they need. Everything below reads that signal\n",
    "directly through the read-only `client.analysis()` surface — the same data the admin UI\n",
    "uses, but composable in a notebook. Point it at any dataset and any embedding model."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15a79570",
   "metadata": {},
   "source": [
    "## Prerequisites\n",
    "\n",
    "- Install the admin extra: `pip install -e \".[admin]\"`.\n",
    "- Have a built dataset registered in your control DB. The shipped example is\n",
    "  **Little League 2025** (fastembed `bge-small-en`, 384-d, no API key needed).\n",
    "- §2 and §3 use the `analysis().chunk_vectors()` endpoint — available since the client-API split.\n",
    "\n",
    "**Engine connection.** The cell below *connects* to an already-running engine if one is up\n",
    "(e.g. the admin console), otherwise it *spawns* its own. Only one process can hold a\n",
    "dataset's vector store at a time — so if you spawn while the admin console is open on the\n",
    "same dataset, you'll hit a lock error. Point `ENGINE_URL` at the running engine, or close it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "de2a655e",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:05:40.610455Z",
     "iopub.status.busy": "2026-07-02T17:05:40.609458Z",
     "iopub.status.idle": "2026-07-02T17:05:40.628104Z",
     "shell.execute_reply": "2026-07-02T17:05:40.627087Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(WindowsPath('C:/Users/stace/AppData/Local/Temp/pelorus_empty_config.yaml'),\n",
       " 'http://127.0.0.1:9090')"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import os, tempfile\n",
    "from pathlib import Path\n",
    "\n",
    "# The engine boots from the control DB; the config file can be empty.\n",
    "os.environ.setdefault(\"PELORUS_CONTROL_DB\", str(Path.home() / \".pelorus\" / \"control.db\"))\n",
    "CONFIG = Path(tempfile.gettempdir()) / \"pelorus_empty_config.yaml\"\n",
    "CONFIG.write_text(\"\")\n",
    "\n",
    "# A running engine to reuse (admin console default is 9090). Set to None to always spawn.\n",
    "ENGINE_URL = \"http://127.0.0.1:9090\"\n",
    "CONFIG, ENGINE_URL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9047feaf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:05:40.634138Z",
     "iopub.status.busy": "2026-07-02T17:05:40.634138Z",
     "iopub.status.idle": "2026-07-02T17:06:13.215003Z",
     "shell.execute_reply": "2026-07-02T17:06:13.212450Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "connected to running engine at http://127.0.0.1:9090\n",
      "using dataset: C:\\Temp\\rag-folders\\little_league_2025 -> 26231940-7b7a-4cb8-89c2-d50218a1f303\n"
     ]
    }
   ],
   "source": [
    "import httpx\n",
    "from pelorus.client import Pelorus\n",
    "\n",
    "def _running(url):\n",
    "    try:\n",
    "        httpx.get(url.rstrip(\"/\") + \"/mgmt/datasets\", timeout=2).raise_for_status()\n",
    "        return True\n",
    "    except Exception:\n",
    "        return False\n",
    "\n",
    "if ENGINE_URL and _running(ENGINE_URL):\n",
    "    rag, owns_engine = Pelorus.connect(ENGINE_URL), False\n",
    "    print(\"connected to running engine at\", ENGINE_URL)\n",
    "else:\n",
    "    rag, owns_engine = Pelorus.local(config=str(CONFIG), startup_timeout=90), True\n",
    "    print(\"spawned a local engine\")\n",
    "\n",
    "# Auto-discover the target dataset from the control DB (prefer Little League, else first enabled).\n",
    "def _pick(datasets):\n",
    "    key = lambda d: ((d.get(\"folder_path\") or \"\") + \" \" + (d.get(\"display_name\") or \"\")).lower()\n",
    "    cands = [d for d in datasets if \"little\" in key(d)] or [d for d in datasets if d.get(\"enabled\")]\n",
    "    if not cands:\n",
    "        raise RuntimeError(f\"No usable dataset among: {[d.get('folder_path') for d in datasets]}\")\n",
    "    return cands[0]\n",
    "\n",
    "target = _pick(rag.dev().list_datasets())\n",
    "DATASET = target.get(\"id\") or target.get(\"folder_path\")   # `dataset=` accepts a registry id or folder path\n",
    "analysis = rag.analysis()\n",
    "print(\"using dataset:\", target.get(\"display_name\") or target.get(\"folder_path\"), \"->\", DATASET)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd0b5b39",
   "metadata": {},
   "source": [
    "## Shared foundation — vectors, and the one trick that makes this portable\n",
    "\n",
    "Every section below reduces to a cosine similarity. Cosine equals a plain dot product\n",
    "**only for unit-length vectors**, so we row-normalize everything up front. Normalizing an\n",
    "already-normalized vector is a harmless no-op (you divide by ~1.0), so this is correct for\n",
    "*any* embedding model — Fastembed, Gemini, OpenAI, Cohere — with no per-model branching.\n",
    "\n",
    "> Note: \"normalized\" means the vector's **length** is 1 (`‖v‖ == 1`), **not** that its\n",
    "> components sit in `[0, 1]`. Embedding components are typically small and include\n",
    "> negatives. The real check is `np.linalg.norm(v) ≈ 1.0`, which `looks_normalized` does."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ef47b12c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:06:13.223350Z",
     "iopub.status.busy": "2026-07-02T17:06:13.222001Z",
     "iopub.status.idle": "2026-07-02T17:06:14.316643Z",
     "shell.execute_reply": "2026-07-02T17:06:14.314626Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from collections import defaultdict\n",
    "from IPython.display import display\n",
    "\n",
    "# --- Tunables: adjust to fit your dataset / embedding model ---\n",
    "ASSUME_NORMALIZED = None   # None = auto-detect from the vectors; True/False to force\n",
    "NEIGHBOR_SIM      = 0.80   # §1 cosine floor to group orphaned intents into a micro-cluster\n",
    "ANSWER_SHARE_SIM  = 0.60   # §2 min intent->chunk cosine to count as \"answered by\" that chunk\n",
    "GAP_SIM_THRESHOLD = 0.65   # §3 >= this to a chunk => curation gap; below => corpus gap\n",
    "DEAD_CONTENT_SIM  = 0.62   # §3 chunks whose best intent match is below this look over-documented\n",
    "\n",
    "\n",
    "def unit(M):\n",
    "    \"\"\"Row-normalize so dot product == cosine similarity, for ANY embedding model.\"\"\"\n",
    "    M = np.asarray(M, dtype=\"float32\")\n",
    "    n = np.linalg.norm(M, axis=-1, keepdims=True)\n",
    "    return M / np.where(n == 0, 1.0, n)\n",
    "\n",
    "\n",
    "def looks_normalized(M, tol=1e-3):\n",
    "    \"\"\"True if rows are already unit-length (norm ~ 1.0).\"\"\"\n",
    "    norms = np.linalg.norm(np.asarray(M, dtype=\"float32\"), axis=-1)\n",
    "    return bool(np.allclose(norms, 1.0, atol=tol))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "59b03230",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:06:14.323385Z",
     "iopub.status.busy": "2026-07-02T17:06:14.323385Z",
     "iopub.status.idle": "2026-07-02T17:06:17.253076Z",
     "shell.execute_reply": "2026-07-02T17:06:17.251036Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "273 intents | 676 chunks | 12 defined clusters\n",
      "vectors already normalized: True\n"
     ]
    }
   ],
   "source": [
    "# Pull the read models. Each is a single call against the analysis surface.\n",
    "imap     = analysis.intent_map(dataset=DATASET)                    # coords + hit_count + status + labels\n",
    "points   = imap.get(\"points\", [])\n",
    "ivecs    = analysis.intent_vectors(dataset=DATASET).get(\"vectors\", {})  # {intent_id: high-dim vector}\n",
    "try:\n",
    "    chunks = analysis.chunk_vectors(dataset=DATASET).get(\"chunks\", [])  # [{chunk_id, content, vector}, ...]\n",
    "except Exception as _e:\n",
    "    print(\"chunk_vectors() unavailable (engine may predate the endpoint) - skipping S2/S3:\", _e)\n",
    "    chunks = []\n",
    "clusters = analysis.clusters(dataset=DATASET)                          # defined-cluster summaries\n",
    "\n",
    "# Align the intents that have BOTH a map point and a stored vector.\n",
    "by_id      = {p[\"intent_id\"]: p for p in points}\n",
    "intent_ids = [p[\"intent_id\"] for p in points if p[\"intent_id\"] in ivecs]\n",
    "I_raw      = np.array([ivecs[i] for i in intent_ids], dtype=\"float32\")\n",
    "hits       = np.array([by_id[i].get(\"hit_count\", 0) for i in intent_ids])\n",
    "status     = np.array([by_id[i].get(\"status\", \"found\") for i in intent_ids])\n",
    "\n",
    "# Chunks (may be empty if the corpus isn't built or the endpoint is unavailable).\n",
    "chunk_ids  = [c[\"chunk_id\"] for c in chunks]\n",
    "chunk_text = {c[\"chunk_id\"]: (c.get(\"content\") or \"\") for c in chunks}\n",
    "C_raw      = (np.array([c[\"vector\"] for c in chunks], dtype=\"float32\")\n",
    "              if chunks else np.zeros((0, I_raw.shape[1] if len(I_raw) else 0), dtype=\"float32\"))\n",
    "\n",
    "detected = looks_normalized(I_raw[:50]) if len(I_raw) else True\n",
    "if ASSUME_NORMALIZED is not None and ASSUME_NORMALIZED != detected:\n",
    "    print(f\"WARN ASSUME_NORMALIZED={ASSUME_NORMALIZED} but vectors look {detected}\")\n",
    "\n",
    "# Normalize defensively regardless — cheap insurance, harmless on unit vectors.\n",
    "I = unit(I_raw)\n",
    "C = unit(C_raw) if len(C_raw) else C_raw\n",
    "\n",
    "# Precompute the intent x chunk cosine matrix once; §2 and §3 both use it.\n",
    "S = I @ C.T if len(C) else np.zeros((len(intent_ids), 0), dtype=\"float32\")\n",
    "\n",
    "print(f\"{len(intent_ids)} intents | {len(chunk_ids)} chunks | {len(clusters)} defined clusters\")\n",
    "print(f\"vectors already normalized: {detected}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a0b41563",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:06:17.265124Z",
     "iopub.status.busy": "2026-07-02T17:06:17.263125Z",
     "iopub.status.idle": "2026-07-02T17:06:17.314255Z",
     "shell.execute_reply": "2026-07-02T17:06:17.312247Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>metric</th>\n",
       "      <th>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>intents (demand signals)</td>\n",
       "      <td>273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>defined clusters</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>of which curated gaps (negative)</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>HDBSCAN noise (unclustered intents)</td>\n",
       "      <td>140</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>miss / partial intents</td>\n",
       "      <td>41</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>source chunks</td>\n",
       "      <td>676</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                metric  value\n",
       "0             intents (demand signals)    273\n",
       "1                     defined clusters     12\n",
       "2     of which curated gaps (negative)      0\n",
       "3  HDBSCAN noise (unclustered intents)    140\n",
       "4               miss / partial intents     41\n",
       "5                        source chunks    676"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# The stakes at a glance.\n",
    "n_noise = sum(1 for p in points if p.get(\"cluster_id\", -1) == -1)\n",
    "n_miss  = int(np.isin(status, [\"partial\", \"not_found\"]).sum())\n",
    "n_neg   = sum(1 for c in clusters if c.get(\"negative\"))\n",
    "display(pd.DataFrame([\n",
    "    {\"metric\": \"intents (demand signals)\",            \"value\": len(points)},\n",
    "    {\"metric\": \"defined clusters\",                    \"value\": len(clusters)},\n",
    "    {\"metric\": \"  of which curated gaps (negative)\",  \"value\": n_neg},\n",
    "    {\"metric\": \"HDBSCAN noise (unclustered intents)\", \"value\": n_noise},\n",
    "    {\"metric\": \"miss / partial intents\",              \"value\": n_miss},\n",
    "    {\"metric\": \"source chunks\",                       \"value\": len(chunk_ids)},\n",
    "]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc4e0453",
   "metadata": {},
   "source": [
    "## §1 — Rescue the hot noise  *(fixes demand-blindness)*\n",
    "\n",
    "HDBSCAN drops sparse points as **noise** (`cluster_id == -1`). But density in embedding\n",
    "space is not the same as importance: a handful of rarely-*phrased* but frequently-*asked*\n",
    "questions are low-density yet high-demand. HDBSCAN throws them away.\n",
    "\n",
    "Here we take only the noise points and re-group them with a plain cosine threshold,\n",
    "**seeded by demand** (highest `hit_count` first). Any emergent group of 2+ is a cluster\n",
    "extract waiting to be written — ranked by the total traffic it would capture. This uses\n",
    "only intent data, so it runs with no corpus and no endpoint additions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2617f47b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:06:17.321029Z",
     "iopub.status.busy": "2026-07-02T17:06:17.320517Z",
     "iopub.status.idle": "2026-07-02T17:06:17.374993Z",
     "shell.execute_reply": "2026-07-02T17:06:17.372987Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "31 emergent micro-cluster(s) HDBSCAN discarded, ranked by rescued demand:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>candidate_size</th>\n",
       "      <th>total_demand</th>\n",
       "      <th>peak_intent</th>\n",
       "      <th>also_includes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5</td>\n",
       "      <td>28</td>\n",
       "      <td>Are there rules about glove size in Little Lea...</td>\n",
       "      <td>What are the glove regulations for  | Is there...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>10</td>\n",
       "      <td>24</td>\n",
       "      <td>How does the run rule work in Little League?</td>\n",
       "      <td>Does Little League actually use the | What is ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>19</td>\n",
       "      <td>What ages play in Senior League Baseball?</td>\n",
       "      <td>What ages play in Senior League Bas | How old ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2</td>\n",
       "      <td>18</td>\n",
       "      <td>Are background checks required for Little Leag...</td>\n",
       "      <td>Are background checks required for</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3</td>\n",
       "      <td>16</td>\n",
       "      <td>How do I calculate my child's league age?</td>\n",
       "      <td>How is a player's league age determ | How do I...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2</td>\n",
       "      <td>15</td>\n",
       "      <td>Can a parent coach their kid's team?</td>\n",
       "      <td>Can a parent coach their kid's team</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>3</td>\n",
       "      <td>14</td>\n",
       "      <td>How far is the pitcher's mound from home plate?</td>\n",
       "      <td>How far is the pitcher's mound from | What is ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2</td>\n",
       "      <td>13</td>\n",
       "      <td>Can a catcher pitch in the same game they caught?</td>\n",
       "      <td>Can a pitcher move to catcher in th</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>How is a checked swing called in Little League?</td>\n",
       "      <td>How is a checked swing called in Li | What is ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>4</td>\n",
       "      <td>13</td>\n",
       "      <td>Can a pitcher re-enter the game after being re...</td>\n",
       "      <td>Can a substituted player return to  | Can a pl...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   candidate_size  total_demand  \\\n",
       "0               5            28   \n",
       "1              10            24   \n",
       "2               3            19   \n",
       "3               2            18   \n",
       "4               3            16   \n",
       "5               2            15   \n",
       "6               3            14   \n",
       "7               2            13   \n",
       "8               3            13   \n",
       "9               4            13   \n",
       "\n",
       "                                         peak_intent  \\\n",
       "0  Are there rules about glove size in Little Lea...   \n",
       "1       How does the run rule work in Little League?   \n",
       "2          What ages play in Senior League Baseball?   \n",
       "3  Are background checks required for Little Leag...   \n",
       "4          How do I calculate my child's league age?   \n",
       "5               Can a parent coach their kid's team?   \n",
       "6    How far is the pitcher's mound from home plate?   \n",
       "7  Can a catcher pitch in the same game they caught?   \n",
       "8    How is a checked swing called in Little League?   \n",
       "9  Can a pitcher re-enter the game after being re...   \n",
       "\n",
       "                                       also_includes  \n",
       "0  What are the glove regulations for  | Is there...  \n",
       "1  Does Little League actually use the | What is ...  \n",
       "2  What ages play in Senior League Bas | How old ...  \n",
       "3                Are background checks required for   \n",
       "4  How is a player's league age determ | How do I...  \n",
       "5                Can a parent coach their kid's team  \n",
       "6  How far is the pitcher's mound from | What is ...  \n",
       "7                Can a pitcher move to catcher in th  \n",
       "8  How is a checked swing called in Li | What is ...  \n",
       "9  Can a substituted player return to  | Can a pl...  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>hits</th>\n",
       "      <th>orphan_intent</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8</td>\n",
       "      <td>How is the Little League mound built up?</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5</td>\n",
       "      <td>What are the rules for first and third base co...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4</td>\n",
       "      <td>How do I request a boundary waiver for my child?</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>Can a player play multiple positions in the sa...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3</td>\n",
       "      <td>What is Tee Ball in Little League and what age...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   hits                                      orphan_intent\n",
       "0     8           How is the Little League mound built up?\n",
       "1     5  What are the rules for first and third base co...\n",
       "2     4   How do I request a boundary waiver for my child?\n",
       "3     4  Can a player play multiple positions in the sa...\n",
       "4     3  What is Tee Ball in Little League and what age..."
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "noise_idx = [k for k, i in enumerate(intent_ids) if by_id[i].get(\"cluster_id\", -1) == -1]\n",
    "\n",
    "groups = []\n",
    "if noise_idx:\n",
    "    Sn  = I[noise_idx] @ I[noise_idx].T          # cosine among noise points only\n",
    "    pos = {k: r for r, k in enumerate(noise_idx)}\n",
    "    assigned = set()\n",
    "    for seed in sorted(noise_idx, key=lambda k: hits[k], reverse=True):  # demand-seeded\n",
    "        if seed in assigned:\n",
    "            continue\n",
    "        r = pos[seed]\n",
    "        members = [k for k in noise_idx if k not in assigned and Sn[r, pos[k]] >= NEIGHBOR_SIM]\n",
    "        assigned.update(members)\n",
    "        groups.append(members)\n",
    "\n",
    "rows = [{\n",
    "    \"candidate_size\": len(g),\n",
    "    \"total_demand\":   int(hits[g].sum()),\n",
    "    \"peak_intent\":    by_id[intent_ids[max(g, key=lambda k: hits[k])]][\"intent_text\"][:50],\n",
    "    \"also_includes\":  \" | \".join(by_id[intent_ids[k]][\"intent_text\"][:35] for k in g[1:4]),\n",
    "} for g in groups if len(g) >= 2]\n",
    "\n",
    "if rows:\n",
    "    hot = pd.DataFrame(rows).sort_values(\"total_demand\", ascending=False).reset_index(drop=True)\n",
    "    print(f\"{len(hot)} emergent micro-cluster(s) HDBSCAN discarded, ranked by rescued demand:\")\n",
    "    display(hot.head(10))\n",
    "else:\n",
    "    print(\"No multi-member noise groups at NEIGHBOR_SIM =\", NEIGHBOR_SIM,\n",
    "          \"- try lowering it, or inspect lone high-hit orphans below.\")\n",
    "\n",
    "# Lone but high-demand orphans are still worth a look (single-question extracts).\n",
    "lone = sorted([k for g in groups if len(g) == 1 for k in g], key=lambda k: hits[k], reverse=True)\n",
    "if lone:\n",
    "    display(pd.DataFrame([{\"hits\": int(hits[k]),\n",
    "                           \"orphan_intent\": by_id[intent_ids[k]][\"intent_text\"][:70]}\n",
    "                          for k in lone[:5]]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b80d5b0",
   "metadata": {},
   "source": [
    "## §2 — Cluster by answer, not by question  *(fixes answer-blindness)*\n",
    "\n",
    "An extract **is** an answer, so the natural way to group intents is *\"what would answer\n",
    "this?\"* — not *\"how is it worded?\"*. `\"How long do I have to return something?\"` and\n",
    "`\"What's your refund window?\"` can sit far apart in question-space yet retrieve the\n",
    "**same policy chunk**. Grouped by answer-source, they're obviously one extract.\n",
    "\n",
    "We take each intent's nearest chunk and group the intents that share it. Each group of\n",
    "differently-worded questions pointing at one source is a **consolidation candidate** —\n",
    "a merge HDBSCAN on question embeddings cannot see."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4e7f96f3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:06:17.382194Z",
     "iopub.status.busy": "2026-07-02T17:06:17.381194Z",
     "iopub.status.idle": "2026-07-02T17:06:17.408602Z",
     "shell.execute_reply": "2026-07-02T17:06:17.406596Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "61 group(s) of distinctly-worded questions that share one source chunk:\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>shared_source_chunk</th>\n",
       "      <th>n_questions</th>\n",
       "      <th>total_demand</th>\n",
       "      <th>questions</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>prepare children for eventual selection to a M...</td>\n",
       "      <td>10</td>\n",
       "      <td>39</td>\n",
       "      <td>What age group plays in Little League Majors  ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>erent color than the uniform (e) No part of th...</td>\n",
       "      <td>5</td>\n",
       "      <td>31</td>\n",
       "      <td>Are molded cleats required for younger Little ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>4 feet wide minimum at center field. e. Backst...</td>\n",
       "      <td>7</td>\n",
       "      <td>30</td>\n",
       "      <td>What is the height of the Little League pitch ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>a pitch to another batter. If a player deliver...</td>\n",
       "      <td>6</td>\n",
       "      <td>27</td>\n",
       "      <td>How many days rest does a pitcher need after  ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>o 14-year-olds (the local league may allow 15-...</td>\n",
       "      <td>5</td>\n",
       "      <td>23</td>\n",
       "      <td>How old are players in Senior League baseball ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0 feet, 6 inches for Junior/Senior League]. (D...</td>\n",
       "      <td>4</td>\n",
       "      <td>22</td>\n",
       "      <td>How wide is the base path in Little League?  |...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>however, a player may only be selected to and ...</td>\n",
       "      <td>4</td>\n",
       "      <td>22</td>\n",
       "      <td>Can a kid play on two different Little League ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>ear-olds. The 8- to 10- and 9- to 11-YearOld B...</td>\n",
       "      <td>7</td>\n",
       "      <td>22</td>\n",
       "      <td>How do you get to the Little League World Ser ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>oach. The league president and player agent ma...</td>\n",
       "      <td>4</td>\n",
       "      <td>21</td>\n",
       "      <td>What is the role of the manager in Little Lea ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>d, shin guards, and catcher's helmet, all of w...</td>\n",
       "      <td>4</td>\n",
       "      <td>20</td>\n",
       "      <td>Can a player add a face mask to their batting ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 shared_source_chunk  n_questions  \\\n",
       "0  prepare children for eventual selection to a M...           10   \n",
       "1  erent color than the uniform (e) No part of th...            5   \n",
       "2  4 feet wide minimum at center field. e. Backst...            7   \n",
       "3  a pitch to another batter. If a player deliver...            6   \n",
       "4  o 14-year-olds (the local league may allow 15-...            5   \n",
       "5  0 feet, 6 inches for Junior/Senior League]. (D...            4   \n",
       "6  however, a player may only be selected to and ...            4   \n",
       "7  ear-olds. The 8- to 10- and 9- to 11-YearOld B...            7   \n",
       "8  oach. The league president and player agent ma...            4   \n",
       "9  d, shin guards, and catcher's helmet, all of w...            4   \n",
       "\n",
       "   total_demand                                          questions  \n",
       "0            39  What age group plays in Little League Majors  ...  \n",
       "1            31  Are molded cleats required for younger Little ...  \n",
       "2            30  What is the height of the Little League pitch ...  \n",
       "3            27  How many days rest does a pitcher need after  ...  \n",
       "4            23  How old are players in Senior League baseball ...  \n",
       "5            22  How wide is the base path in Little League?  |...  \n",
       "6            22  Can a kid play on two different Little League ...  \n",
       "7            22  How do you get to the Little League World Ser ...  \n",
       "8            21  What is the role of the manager in Little Lea ...  \n",
       "9            20  Can a player add a face mask to their batting ...  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "if not len(C):\n",
    "    print(\"No chunk vectors returned. Ensure the corpus is built and analysis().chunk_vectors() is available.\")\n",
    "else:\n",
    "    nearest = S.argmax(1)\n",
    "    nsim    = S.max(1)\n",
    "    share   = defaultdict(list)\n",
    "    for k, ci in enumerate(nearest):\n",
    "        if nsim[k] >= ANSWER_SHARE_SIM:\n",
    "            share[int(ci)].append(k)\n",
    "\n",
    "    rows = [{\n",
    "        \"shared_source_chunk\": chunk_text[chunk_ids[ci]][:70],\n",
    "        \"n_questions\":         len(ks),\n",
    "        \"total_demand\":        int(hits[ks].sum()),\n",
    "        \"questions\":           \"  ||  \".join(by_id[intent_ids[k]][\"intent_text\"][:45] for k in ks[:4]),\n",
    "    } for ci, ks in share.items() if len(ks) >= 2]\n",
    "\n",
    "    if rows:\n",
    "        ans = pd.DataFrame(rows).sort_values(\"total_demand\", ascending=False).reset_index(drop=True)\n",
    "        print(f\"{len(ans)} group(s) of distinctly-worded questions that share one source chunk:\")\n",
    "        display(ans.head(10))\n",
    "    else:\n",
    "        print(\"No shared-source groups at ANSWER_SHARE_SIM =\", ANSWER_SHARE_SIM, \"- try lowering it.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "94735945",
   "metadata": {},
   "source": [
    "## §3 — The supply / demand map  *(fixes corpus-blindness)*\n",
    "\n",
    "A miss and a partial look identical to a user, but they have opposite fixes:\n",
    "\n",
    "- **Curation gap** — the answer *is* in your docs (a chunk is close), nobody wrote an\n",
    "  extract. → *Write an extract.*\n",
    "- **Corpus gap** — nothing in the docs is close. → *Write new content.*\n",
    "\n",
    "We split every miss/partial by its **nearest-chunk similarity** against\n",
    "`GAP_SIM_THRESHOLD`. As a bonus, the same matrix reveals **dead content**: chunks no live\n",
    "demand comes near — over-documented material and prune candidates. None of this is in the\n",
    "admin UI today; it's a strong candidate for a future *Corpus Health* panel."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "45296285",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:06:17.415969Z",
     "iopub.status.busy": "2026-07-02T17:06:17.414906Z",
     "iopub.status.idle": "2026-07-02T17:06:17.472038Z",
     "shell.execute_reply": "2026-07-02T17:06:17.471025Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "41 miss/partial intents split by remediation:"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>intent</th>\n",
       "      <th>hits</th>\n",
       "      <th>status</th>\n",
       "      <th>nearest_chunk_sim</th>\n",
       "      <th>action</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Who is Mo'ne Davis?</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.449</td>\n",
       "      <td>corpus gap -&gt; write new content</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>What is Lamade Stadium?</td>\n",
       "      <td>2</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.550</td>\n",
       "      <td>corpus gap -&gt; write new content</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Has Japan ever won the Little League World Ser...</td>\n",
       "      <td>2</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.624</td>\n",
       "      <td>corpus gap -&gt; write new content</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>What are the rules for first and third base co...</td>\n",
       "      <td>5</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.846</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>How do I request a boundary waiver for my child?</td>\n",
       "      <td>4</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.750</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Can a player play multiple positions in the sa...</td>\n",
       "      <td>4</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.744</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>How is ERA calculated in Little League?</td>\n",
       "      <td>4</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.767</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>How many international teams are in the Little...</td>\n",
       "      <td>4</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.769</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Can a pitcher re-enter the game after being re...</td>\n",
       "      <td>4</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.822</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>What pitch count forces a day of rest before p...</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.843</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>What is the oldest age for Little League Baseb...</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.799</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>What is the USA Bat standard in Little League?</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.880</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>What is a mercy rule in Little League?</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.764</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>How do I know if a bat is certified legal for ...</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.803</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>What are the consequences for a player being e...</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.790</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>Have any girls played in the Little League Wor...</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.673</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>When does Little League registration typically...</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.807</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>How many coaches are allowed in the dugout dur...</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.852</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>Does Little League require mouth guards for pl...</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.801</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>Who invented Little League Baseball?</td>\n",
       "      <td>3</td>\n",
       "      <td>not_found</td>\n",
       "      <td>0.711</td>\n",
       "      <td>curation gap -&gt; write an extract</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                               intent  hits     status  \\\n",
       "0                                 Who is Mo'ne Davis?     3  not_found   \n",
       "1                             What is Lamade Stadium?     2  not_found   \n",
       "2   Has Japan ever won the Little League World Ser...     2  not_found   \n",
       "3   What are the rules for first and third base co...     5  not_found   \n",
       "4    How do I request a boundary waiver for my child?     4  not_found   \n",
       "5   Can a player play multiple positions in the sa...     4  not_found   \n",
       "6             How is ERA calculated in Little League?     4  not_found   \n",
       "7   How many international teams are in the Little...     4  not_found   \n",
       "8   Can a pitcher re-enter the game after being re...     4  not_found   \n",
       "9   What pitch count forces a day of rest before p...     3  not_found   \n",
       "10  What is the oldest age for Little League Baseb...     3  not_found   \n",
       "11     What is the USA Bat standard in Little League?     3  not_found   \n",
       "12             What is a mercy rule in Little League?     3  not_found   \n",
       "13  How do I know if a bat is certified legal for ...     3  not_found   \n",
       "14  What are the consequences for a player being e...     3  not_found   \n",
       "15  Have any girls played in the Little League Wor...     3  not_found   \n",
       "16  When does Little League registration typically...     3  not_found   \n",
       "17  How many coaches are allowed in the dugout dur...     3  not_found   \n",
       "18  Does Little League require mouth guards for pl...     3  not_found   \n",
       "19               Who invented Little League Baseball?     3  not_found   \n",
       "\n",
       "    nearest_chunk_sim                            action  \n",
       "0               0.449   corpus gap -> write new content  \n",
       "1               0.550   corpus gap -> write new content  \n",
       "2               0.624   corpus gap -> write new content  \n",
       "3               0.846  curation gap -> write an extract  \n",
       "4               0.750  curation gap -> write an extract  \n",
       "5               0.744  curation gap -> write an extract  \n",
       "6               0.767  curation gap -> write an extract  \n",
       "7               0.769  curation gap -> write an extract  \n",
       "8               0.822  curation gap -> write an extract  \n",
       "9               0.843  curation gap -> write an extract  \n",
       "10              0.799  curation gap -> write an extract  \n",
       "11              0.880  curation gap -> write an extract  \n",
       "12              0.764  curation gap -> write an extract  \n",
       "13              0.803  curation gap -> write an extract  \n",
       "14              0.790  curation gap -> write an extract  \n",
       "15              0.673  curation gap -> write an extract  \n",
       "16              0.807  curation gap -> write an extract  \n",
       "17              0.852  curation gap -> write an extract  \n",
       "18              0.801  curation gap -> write an extract  \n",
       "19              0.711  curation gap -> write an extract  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "9 of 676 chunks look over-documented (no nearby demand):\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>chunk_snippet</th>\n",
       "      <th>best_demand_sim</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>with a Disorder of Sexual Development the oppo...</td>\n",
       "      <td>0.540</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>ling, excessive tickling, or any other deliber...</td>\n",
       "      <td>0.561</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>at could be used to halt activities. 1. If lig...</td>\n",
       "      <td>0.565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>physical injury. · Emotional and Psychological...</td>\n",
       "      <td>0.585</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>- Lightning Safety Guidelines\\nEach year acros...</td>\n",
       "      <td>0.596</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>ty. Due to the nature of lightning, personal e...</td>\n",
       "      <td>0.597</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>the Committee to communicate with the particip...</td>\n",
       "      <td>0.610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>thorization Act of 2010, defines child abuse a...</td>\n",
       "      <td>0.614</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>ey are not able to devote the attention needed...</td>\n",
       "      <td>0.617</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                       chunk_snippet  best_demand_sim\n",
       "0  with a Disorder of Sexual Development the oppo...            0.540\n",
       "1  ling, excessive tickling, or any other deliber...            0.561\n",
       "2  at could be used to halt activities. 1. If lig...            0.565\n",
       "3  physical injury. · Emotional and Psychological...            0.585\n",
       "4  - Lightning Safety Guidelines\\nEach year acros...            0.596\n",
       "5  ty. Due to the nature of lightning, personal e...            0.597\n",
       "6  the Committee to communicate with the particip...            0.610\n",
       "7  thorization Act of 2010, defines child abuse a...            0.614\n",
       "8  ey are not able to devote the attention needed...            0.617"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "best_chunk_sim = S.max(1) if len(C) else np.zeros(len(intent_ids))\n",
    "miss_mask = np.isin(status, [\"partial\", \"not_found\"])\n",
    "\n",
    "gap = pd.DataFrame({\n",
    "    \"intent\":            [by_id[i][\"intent_text\"][:55] for i in intent_ids],\n",
    "    \"hits\":              hits,\n",
    "    \"status\":            status,\n",
    "    \"nearest_chunk_sim\": np.round(best_chunk_sim, 3),\n",
    "})[miss_mask].copy()\n",
    "\n",
    "gap[\"action\"] = np.where(gap[\"nearest_chunk_sim\"] >= GAP_SIM_THRESHOLD,\n",
    "                         \"curation gap -> write an extract\",\n",
    "                         \"corpus gap -> write new content\")\n",
    "gap = gap.sort_values([\"action\", \"hits\"], ascending=[True, False]).reset_index(drop=True)\n",
    "print(f\"{len(gap)} miss/partial intents split by remediation:\")\n",
    "display(gap.head(20))\n",
    "\n",
    "if len(C):\n",
    "    per_chunk_best = S.max(0)\n",
    "    dead = pd.DataFrame(\n",
    "        [(chunk_text[chunk_ids[j]][:65], round(float(per_chunk_best[j]), 3))\n",
    "         for j in range(len(chunk_ids)) if per_chunk_best[j] < DEAD_CONTENT_SIM],\n",
    "        columns=[\"chunk_snippet\", \"best_demand_sim\"],\n",
    "    ).sort_values(\"best_demand_sim\").reset_index(drop=True)\n",
    "    print(f\"\\n{len(dead)} of {len(chunk_ids)} chunks look over-documented (no nearby demand):\")\n",
    "    display(dead.head(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "74447472",
   "metadata": {},
   "source": [
    "## The map — where demand is served vs where the corpus falls short\n",
    "\n",
    "Same UMAP coordinates as the admin console, recolored by the classification above and\n",
    "sized by demand. Big, dark-red points are high-traffic questions your corpus can't answer\n",
    "at all; orange points are answerable but uncurated. That's your backlog, in priority order."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "83a34014",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:06:17.478077Z",
     "iopub.status.busy": "2026-07-02T17:06:17.477067Z",
     "iopub.status.idle": "2026-07-02T17:06:19.115186Z",
     "shell.execute_reply": "2026-07-02T17:06:19.113659Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3oAAAJOCAYAAADhz3V3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAADkJklEQVR4nOzdBXij6XU24CNmM7M99jDuLDNvkt0NN/iH2kAh0HDSNNikDTQNU5s0nKZhbLLMkKXZ4fGMZzxmRjH/1/POSCPJkscgg6TnzuXMWpKlT/yd75z3HE00Go0KERERERER5Q3tWm8AERERERERZRcDPSIiIiIiojzDQI+IiIiIiCjPMNAjIiIiIiLKMwz0iIiIiIiI8gwDPSIiIiIiojzDQI+IiIiIiCjPMNAjIiIiIiLKMwz0iIiIiIiI8gwDPaIC9LGPfUw0Gs1ab0beuPbaa9XPenD69Gn13H7ve9+TXHT//fer7f/FL35x3su+/vWvl5aWllXZLuJjTkSUaxjoUUHBzi92ImM/ZrNZ6urq5JZbbpEvf/nL4nQ613oTqcD85Cc/kS9+8YtrvRl5wePxqIMYCBbzQb7dHyoM//d//6det8vxr//6r/Kb3/wma9tEVKgY6FFB+sQnPiE//OEP5Rvf+Ia87W1vU6f94z/+o+zYsUMOHDiw1ptHOebOO+9UP+sh0Gtubhav1yuvec1rJN/913/9l3R2diYFRh//+MfzJjDKt/tDhRPo4XW7HAz0iLJDn6XrIcopz33uc+XCCy+M//7BD35Q7r33Xrntttvk+c9/vhw9elQsFsuabiPlDqPRKOtFLFNdCAwGw1pvAi1DJBKRQCBQMK/XxXC73WKz2dZ6M4goxzGjR3TW9ddfLx/+8Ielp6dHfvSjHyU9LseOHZOXvvSlUlZWpnZKECT+7ne/S1sW+vDDD8vb3/52qayslJKSEnnLW96idmamp6flta99rZSWlqqf973vfRKNRpOu49///d/l8ssvl/LychVo7t27N+1aJdzOW9/6VlXasn37djGZTLJt2zb585//POey2J6LLrpIbfeGDRvkW9/61oKfc6w7w/Ujy3nNNdeI1WqV9vb2+DY98MADcskll6ht3bRpk9x9991Jf4/H8u///u/VebgM7tdf/dVfqXVk6R67Bx98UD1euFxRUZF6vKamplZkfSKe05e97GXqdnB773jHO8Tn8yVdNhQKyb/8y7+oxw2PMdaD/dM//ZP4/f551+jF1pn97Gc/k0996lPS0NCgHv8bbrhBurq6kv7uj3/8o3qcYuXE51tzdtddd8mVV16pXlt2u109ttimTGv0YtuS7if1tv70pz/JVVddpXYwHQ6H3HrrrXL48GFZqyBgvscudY0e7jfec4BsQuw+nq+EDO/Ld77znep68Bzj9vC6Gx8fj19mdHRU/uZv/kaqq6vVtuzatUu+//3vJ11P7HFOzb6lWzOJ7cZzNzAwIC984QvVf2Pb3/Oe90g4HF7W/ckEn2kXX3yxeg/j8+fqq6+ek4X++te/rj5H8DigpP0f/uEf1OOzkKDk3e9+tzQ2Nqq/xWsSn2Wpn2+xz60f//jH8dtJ95m1Uv7yl7/I8573PHX/8RrfuXOnfOlLX0q6DA74xd4DeI+94AUvUAf+YvDZh/uBz75U+GzFeYcOHVrSdweuE5+XVVVV6nW4mM9QiH1O43L4+09+8pPy3e9+V1136uWX+l4PBoPq9djR0aHuD7YHn0f4XIq9tr/2ta+p/078rFnMdxwuj9cU3mOxv8f1xq4/3WdkunXn5/usJCoEzOgRJUC5G74IsAP0pje9SZ2GL78rrrhC6uvr5QMf+ID6YsQOPHbQfvnLX8qLXvSipMcQpaA1NTXqy/Dxxx+X//zP/1RfNI8++qg0NTWpkhSUtnzuc59TQRR2KmOw04GM4qtf/WoVHP70pz9VX+p/+MMf1BdxagD3q1/9Su0E4Isaawxf8pKXSG9vr/oShYMHD8rNN9+sdhjxRYjA5aMf/ajaYV0oBFrIdL7iFa9Q24JyV/w3dtZQ7vq3f/u38qpXvUrdH+zQ9PX1qe2BJ598Ut1vXB47HtjZwN8jwDly5Ija6UyEnUA8VthWlOThstjRie1EZxOCPOww/Nu//Zt6nvD44b7+4Ac/iF/mjW98o9rZwP3Cjix2FHF57Pj9+te/Pu9tfPrTnxatVqt24GdmZuSzn/2sem5xPfChD31Ind7f3y9f+MIX1GnYIckEr0U8F9hBRfkxdpQR/DzyyCMZ/2bLli2qTDkRdt7f9a53qR3KGFzmda97nVqv+pnPfEaVDeLxx47Svn375g1AEZRNTk7KQhQXFy8oE3e+xy4VXuPY3r/7u79T78kXv/jF6nQ8Vpm4XC61s4vn86//+q/lggsuUAEedsTxnFRUVKgyWLxe8Tjj9dna2io///nP1Q4nHkccIFgKBHR4rHGgBDu/OEjy+c9/Xh1UwH1Yyv3JBJ9FeE9hBxuvG2Sg8TgiqMHnA+B8XO7GG29Utxl7/+E9jNdXpucMwRw+s+677z4VDO/evVvuuOMOee9736sC2djrOga3ic9PPJZ4fOd7XeH5ST34kg62Da+r+WCnH++d2tpa9ZzhMxrPOz5bY88hngNUe7S1tanHA8/9V77yFfX5/8wzz6htxecw3qO4DwiqEv3v//6vCmDxub6U7w58luN5/8hHPqICncV8huKxvu6669TnJCpUcFvf/va31WdEquW81/G44DMQn404cDA7OytPPfWUenxuuukmdaBucHBQPd6pnzsL/Y7D38Wu/81vfrM6De+LxVjKZyVRXooSFZDvfve7OMQcffLJJzNepri4OLpnz5747zfccEN0x44dUZ/PFz8tEolEL7/88mhHR8ec677lllvU+TGXXXZZVKPRRP/2b/82flooFIo2NDREr7nmmqTb9ng8Sb8HAoHo9u3bo9dff33S6bgdo9EY7erqip+2f/9+dfpXvvKV+GkvfOELo2azOdrT0xM/7ciRI1GdTqcuez7YPlzuJz/5Sfy0Y8eOqdO0Wm308ccfj59+xx13qNPxOGS6P/DYY4+py/3gBz+Y89jt3btX3eeYz372s+r03/72t9Fs+ehHP6qu8/nPf37S6X//93+vTsfjCM8++6z6/Y1vfGPS5d7znveo0++9996kxynxubzvvvvUZbZs2RL1+/3x07/0pS+p0w8ePBg/7dZbb402NzcvaNu/8IUvqL8fGxvLeJnu7u45z0MivDZvu+22qN1ujx4+fFid5nQ6oyUlJdE3velNSZcdHh5W74fU0zPd5kJ+8NjMZzGP3ete97qkxw6PCy6D53ghPvKRj6jL/+pXv5pzXuw9/MUvflFd5kc/+lH8PLxG8b7GYzg7O5u03an3L93zge3GaZ/4xCeSLovPHbwHlnp/0jlx4oR6r77oRS+KhsPhtPdxdHRUfZ7cfPPNSZf56le/qm7/v//7vzM+5r/5zW/UZT75yU8mXfdLX/pS9bmX+BkV+9yIve7OJ/Y4ne8n9XM0FT5vW1tb1XZPTU2lfQxg9+7d0aqqqujExET8NHweYJtf+9rXxk975StfqS6H640ZGhpSl0t8Thf73XHllVcmXediPkPf9ra3qcd737598dNwP8rKytRl8TrMxnt9165d6jNrPv/wD/+Q8ftlod9xNptNPf+pUl9/qZ/ri/msJCoELN0kSoGjtbHum8hS4Ag0sj84DUf78TMxMaGOhp44cUIdSU2Eo9qJ2Sccscc+Dk6P0el0qoTn1KlTSX+buC4Q2SVkMpBxwNHSVDjynniUE0cuUYYYu05kDHBkHUePkUlMzPBg2xfzeOBocgzKX5B1w/XgviXeT0i8T4n3ByU/eNxQ+om/T3efcPQ2MXOAzIJer1cZ0GxDWVqiWFOe2G3F/kXmKxEye4CSy/N5wxvekLR+D88lpD7vC4XHDX7729+qLNpSoBQVR89RLrZ161Z1Go6+Izv1yle+Mv4axw9ep3heka2ZD7IjuI6F/KDscSGy/dilg6wKtic1swKx9zBeB7h/eGxi8BpFeTYyTulK+BYK2fBEuI/ZvH+A8m68VpAlQoY03X1EJgvZFWToEy+DqgZ8psz3Wsfjg9cJHo/U9wk+91AimAhZsNjr7nxQ3r6Q1xQyofNBlqq7u1vdv9h7KPUxGBoakmeffVZlalFmmfi5ikxV4mfQy1/+clXOm1imi/JDPM44b6nfHXi88VgmWuhnKEpgL7vsMpVRjcH9QOYs0XLf67hdZMuw/UuxmO+45cjGZyVRPmDpJlEK7LzFStpQ6oGdFazdw086+MJHaU5MYlAFsZIirF9JPT11/Rl2wLGuAjscievA0pUtpt4OYO1J7DrHxsZU6RHWUqRCsLbQ4AnlQqm3j21Pd38g8T7h9lHmg3Ui2KlJXLODL/hUqduKIBOlVunWoyTeRup1Ycf8fFJvC0EzdnJjt4WSUfyOnarU68ZOBM4/n9TnCM8PLHXdIXYiUY6FsiaUgmHdGkr6UFqauhOfDnYGUZ6H0i6U+cbEdtqwTjUd7OzPB2t1cOAhm7L92KVz8uTJpMchHTzPeK2kPr440BE7fynwmMXW4KV7/2bzPmLb5wuuYvcBnwuJEGijjHG++4jzsJ4vVq59vscHpa8LhW1eaFB4vscAYiWVi3kMYvcFB81iDVKe85znqM87lGriPQj4bwRZGzduXPJ3R7rHZqGfodh+BHqpUj+/lvteRxkk1i3ifuLxxGOBJQ8LLSlezHfcciz3s5IoXzDQI0qAdTn48ox9OcaOBGKdUKYsWOoXaeoR2flOT/zSfuihh9TaBTRJQFMEBDjIHOALHi34F3J9qdeZDYu5P6m3jywZth9H0rETgp0jfKEjQ5ito6zYwUL2J9M2LFSmHY3l7IBk+znC0XA0rMFRd2RZELjh/mOnDetKM90eIKOBo/vITmBHK1HsucDamHRBMrKq80H2GAcWFgJZhoV0KV2t13e2ZHqdxJqrpJrvucpni+lmjM9iBDrng9dTYhZupWG9FyolsE4Xn9UjIyNq7RfWX8cs5bsj3WOT7c/Q5b7X8f2EwBmZMnzmIJjCOsxvfvObKqiaz2K/45bzPlvOZyVRPmGgR5Qgtng89sWMo9mAL6NsZyzSlZHhKD+OHCcuoMeX4FIgW4Avu3QlNomzx1YSypmw6D+xtArNFTJ18sO2oqFAYnYVJVXolJcJnqtYx7fFwG0lHkHHEXjsBMUaEWAeHX7H5WLZCcBOHbYf52fDYgNJHI3G0Wn8/Md//IfauURTF+zQZHqNYmcZR7ORifyf//mfOUe0YyXAyGQv5XWOBjwLzdRgOxM7lGbTYh9L3O/EDonp4HlGN0O8FhIfN3RTjJ2fmHFMfW0vNeOXrSwH7iO2HY07Esv6EsXuAz4XYp95gHJOHCCY7zWBv0XpJ8oTE7N6qY/PUqBJSmp303RQDjrfrMHY6xvPdab7kvgYpMJ9QeOYxHEHyBhh2+655x7V1AUHIGJlm9n87ljoZyi2P7UrLaSettz3OiCoxsE1/OAzGoEbmrTEAr1Mr9vFfMdlug68z9J9f6R7ny3ls5Io3zB/TXQW1lNg/RJ2WGPrGvBliJ1StM1GwJFqoVmMhcARRny5JR6ZRBkh1tgs9foQBOHv0YkzBjsl+KJdDdiG1AwMuthlynKgQynWocSgExw6haITXiY4Kowv7cSfhYi1AE/cLojdViy4TB1mjh0GSO2CulTYeUxXxppOus6WsZ331JEPqWvBjh8/rjIQsYAkEV4nKNnCjlDi47/Q1/lKrNFbilgHwoWMBACUbe7fvz9tB9XY6xavg+HhYZUNiMFrEq8XlBbHOi9iRxuvd2QREiFzsVr3Jx1knrDDi5K71AxQ7D7iPYOsGDrPJr5fv/Od76jX5nyvdTw+eD9/9atfTTodWR58ns333l2tNXroporPdbyXUx/L2P3F5wjeSwjeEi+D4BAZoNSDTXjMEPDgdYEfdIhMPNiRre+OhX6G4j382GOPqZLIxM8LdEfO5nsdawQT4T2AzGTi508sIE59rBfzHYfrSPe6R6CK1yQOvsTg8U19Dy/1s5Io3zCjRwUJDQJwlBY7bMjQIMjDDgN21tBaPXGALwICtJ3esWOHWiyPI7X4G3ypotQTO4rZgJ0pBBFY84BxBVi/gdvGl2jil9piYD0WSlaw2B2tu2M7qGgBvtTrXAy0t0aWFOVGWGuDxwxH/2PjH1Ihg4Cjr2hggCPr2EnGY49yn2xDpgLXi8cb24U5Y3jcY4EI/sWRdASf2OHADv0TTzyhdgSx85yYeVwOzJHCjiKavmDeIXacbr/99rSXxc46Agm8VvBaxWsEjxHWUeJxSgdlSxgZgaAGz3ni847bwn3Bjh+Caqy1wU4xysKQEcYBAvw9WsSn7siv9Bq9pUAGG68zPJ5YQ4QdcawjyrQ2CyMAkDFBe3eMV8BzgR1EfAagFA2vATQIws46mnQ8/fTTKuOLv0GpHgKHWBYLr3FcD95f2JnFDinWI+E5Won7gx1kBBZ4jSbO6EuFzw9kMXAQC58DyOwim4K2/Vhbh/VfeK6xbhOfF3g/4H0Re//hNfn//t//y3j9eK3ivYDbwDbhMUNghNI+lBsuti3+SqzRQ6CL1ze2FTv7yEQhsMN3ABqLxA58YUQMAlOUSKJ5Vmy8Ap7b1PmFyNThscR4AKzdw4iMVNn47ljoZyiCYnyGoTQb5Z6x8QpY64rXdCxDttz3OrYBASzeK3g9YrQC3g8YlxGD8wANehBYIsDD7SzmOw7XgfuJy+N1itc6msXget7//verBkq4/thoCLw/Ehu6LOWzkigvrXXbT6LVFGtjHftBS/GamproTTfdpNq3x1qlpzp58qRqr43LGgyGaH19vWpR/4tf/OK8oxtibZ9T2zyjTTRaSCf6zne+o9pum0ym6ObNm9V1praNBvyOFtap0HY6tSX1Aw88oFq24762tbVFv/nNb6a9znTQtnzbtm1pbyddi+3U7UIr8ze84Q3RiooK1YoeoycwniF1O2OPHbb1zW9+c7S0tFRd/tWvfnVSq/NsiN13jJlAC3iHw6Fu761vfWvU6/UmXTYYDEY//vGPq9bseN4bGxujH/zgB5Papc83XuHnP//5eVvtu1yu6Kte9SrV8hznzTdq4Z577om+4AUviNbV1annE/+i1fvx48cz3kbqaz7xJ/W2sN14jtBmHWM5NmzYEH39618ffeqpp6KrZTGPXbpW648++mj89b6Q0QR4feG5x3saf4OxJ7je8fHx+GVGRkbir2NcBi3z042vwHv8JS95SdRqtarX1Fve8pbooUOH0m536nsf0r0vM90fjJnA7x/4wAeiC4ERCRjfgM8WbBter3fddVfSZTBOAZ87eK1XV1dH/+7v/m7OOIJ0jzla9r/zne9Ur0f8LT7DPve5zyWNLpjvc2u1PPzww+qzHu95PP47d+5MGkcDd999d/SKK66IWiyWaFFRUfT2229XnxXp4PHDfcJYg76+vqx/dyzmMxQwWuGqq65SzzFex//2b/8W/fKXv6yuG+MTsvFexxiNiy++WH1e4THC6+VTn/pU0lgcjIjAuIfKykr12CS+phf6HYf7ePXVV6vbwHmJ9/XOO+9UIxnwnti0aZMafZJ6HQv5rCQqBBr831oHm0RU2JCRwFF2ZBkwdmIlxQZDo0QJ626IchGyE8jioDFGdXX1Wm8OrVPIqiIjjbV0bEBCVHi4Ro+IiCjHoKEEStcY5FFMaodSrKdD2SdKFRnkERUmrtEjIiLKMT//+c/XehNoncHaQqyfQ5dgrAVEM53Z2dmMc/yIKP8x0CMiIiLKcegMisYoaCCF5itotoJgD+MPiKgwcY0eERERERFRnuEaPSIiIiIiojzDQI+IiIiIiKgQ1+hFIhEZHBxUg2FjQzeJiIiIiIho9WAyntPplLq6OtFqtcsP9BDkNTY2Zmv7iIiIiIiIaIn6+vqkoaFh+YEeMnmxKywqKlrq9hAREREREdESYWwKEnCx+GzZgV6sXBNBHgM9IiIiIiKitbOQ5XRsxkJERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6RERERES0bK9//evlhS984Xkv95rXvEb+9V//ddUf8Q984APytre9bdVvd60w0CMiIiIiolWxf/9++b//+z95+9vfrn4PBoPy/ve/X3bs2CE2m03q6urkta99rQwODib93fOf/3xpamoSs9kstbW1KlhMvMz9998vL3jBC9R5uJ7du3fLj3/846TreM973iPf//735dSpUwXxbDPQIyIi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/1EJhiNiqN+l1ufp7DVr8ywSERERERElYKCXoNzuUD8XNLWKNmEEA9bj4Xc0bYH94y5xmLZK67Zd0lBcLPaqNtHoDDKfsNcn/oEhCU5Mi9ZsEnNDrRjKS+f9GyIiIiIioqVgoJdGYpAHpcjuVdfJseGB+GlOv1+OhkLS2rD5vEFecGZWJv5wt7iePhA/TVfkkJrX/ZVYWpv4yiUiIiIioqziGr0F0Gm1sruxWfY0tohJr1djFWqLS+TmrTul0l503r/3HDyWFORBeNYpoz/9rYSccxvAEBERERERLQczegtkN5llb3ObbKyulXAkIlaTWYy6M6MV5hP2+WXmsafTnhccm5DAyKjoHa2Le9aIiIiIiIjmwUBvkRxmy+L+IByWaDCY8exo6EyTFyIiIiIiomxh6eYK09msYtu5Nf2Db7OKsaJspTeBiIiIiIgKDAO9VeDYu1P0qR02tVqpeMHNYmCgR0REREREWcbSzVVgqq2Suje9WjzHT4m386Toy0rEvmOLmFsbV+PmiYiIiIiowDDQWyXGqgr1U3Llxat1k0REREREVKBYuklERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeYaBHhERERERUZ5hoEdERERERJRnGOgRERERERHlGQZ6REREREREeUa/1htAtJKiIb+EZvsk7BoU0epF72gUXVG9aDQ8xkFERERE+YuBHuWtSNAjvpN3iO/UnxHynTlRaxDbzteLsfZC0Wg0a72JREREREQrgmkNyluhyRPiO/Wnc0EeRILiPvh9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",
      "text/plain": [
       "<Figure size 900x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "xy  = np.array([[by_id[i].get(\"x\", 0.0), by_id[i].get(\"y\", 0.0)] for i in intent_ids])\n",
    "cat = np.full(len(intent_ids), \"served\", dtype=object)\n",
    "for k in range(len(intent_ids)):\n",
    "    if status[k] in (\"partial\", \"not_found\"):\n",
    "        cat[k] = \"curation gap\" if best_chunk_sim[k] >= GAP_SIM_THRESHOLD else \"corpus gap\"\n",
    "\n",
    "colors = {\"served\": \"#7fb3ab\", \"curation gap\": \"#e8a13a\", \"corpus gap\": \"#d1495b\"}\n",
    "fig, ax = plt.subplots(figsize=(9, 6))\n",
    "for c in [\"served\", \"curation gap\", \"corpus gap\"]:\n",
    "    m = cat == c\n",
    "    if m.any():\n",
    "        ax.scatter(xy[m, 0], xy[m, 1], s=20 + 6 * np.sqrt(np.maximum(hits[m], 0)),\n",
    "                   c=colors[c], label=f\"{c} ({int(m.sum())})\",\n",
    "                   alpha=0.78, edgecolors=\"white\", linewidths=0.4)\n",
    "ax.set_title(\"Demand map - point size = hit count, color = coverage status\")\n",
    "ax.set_xticks([]); ax.set_yticks([])\n",
    "ax.legend(loc=\"best\", frameon=False)\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f1f93642",
   "metadata": {},
   "source": [
    "## Where this goes next\n",
    "\n",
    "Three surfaces, one read-only API, no writes to your engine:\n",
    "\n",
    "1. **Hot-noise recovery** turns discarded HDBSCAN noise into a ranked list of new cluster\n",
    "   extracts — pure demand signal, no corpus needed.\n",
    "2. **Answer-source clustering** finds questions that should share one extract because they\n",
    "   share one source chunk.\n",
    "3. **Supply/demand map** separates *write-an-extract* from *write-new-content*, and flags\n",
    "   over-documented chunks.\n",
    "\n",
    "Each is a few lines of numpy over `client.analysis()` — which is the point: your retrieval\n",
    "system's own telemetry is a first-class analytics dataset. This notebook is the proof of\n",
    "concept for a *Corpus Health* view; the thresholds at the top are the only knobs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "8ae755c2",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-07-02T17:06:19.122460Z",
     "iopub.status.busy": "2026-07-02T17:06:19.120943Z",
     "iopub.status.idle": "2026-07-02T17:06:19.129226Z",
     "shell.execute_reply": "2026-07-02T17:06:19.127691Z"
    }
   },
   "outputs": [],
   "source": [
    "# Only shut down the engine if this notebook spawned it (leave a shared one running).\n",
    "if owns_engine:\n",
    "    rag.shutdown()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
