Last active
March 16, 2026 19:36
-
-
Save sxalexander/92e7aa95898725789f47de89faa2d1bf to your computer and use it in GitHub Desktop.
conflict_viewer.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/sxalexander/92e7aa95898725789f47de89faa2d1bf/conflict_viewer.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "FCHFvRq504Nv" | |
| }, | |
| "source": [ | |
| "# Source Conflict Viewer\n", | |
| "\n", | |
| "**Silver -> Gold** -- Where multiple sources diverge on shared design system entities.\n", | |
| "\n", | |
| "Add conflict JSON file paths to the `CONFLICT_FILES` list and run all cells." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "vYX0CMGI04Nw", | |
| "outputId": "8a2d4094-fe3c-4c3d-8e5b-99e6825a7d4d" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008000; text-decoration-color: #008000\">Ready</span>\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[32mReady\u001b[0m\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# ── Setup ─────────────────────────────────────────────────────────────────────\n", | |
| "try:\n", | |
| " import polars\n", | |
| "except ImportError:\n", | |
| " %pip install -q polars rich\n", | |
| "\n", | |
| "import json, re, io\n", | |
| "from pathlib import Path\n", | |
| "import polars as pl\n", | |
| "from rich.console import Console\n", | |
| "from rich.table import Table\n", | |
| "from rich import box\n", | |
| "\n", | |
| "console = Console(width=120)\n", | |
| "\n", | |
| "SOURCE_STYLES = {\n", | |
| " \"KNAPSACK\": \"bold blue\",\n", | |
| " \"STORYBOOK\": \"bold yellow\",\n", | |
| " \"FIGMA\": \"bold magenta\",\n", | |
| " \"CODE\": \"bold green\",\n", | |
| " \"MDX\": \"bold cyan\",\n", | |
| "}\n", | |
| "\n", | |
| "def styled_source(s: str) -> str:\n", | |
| " style = SOURCE_STYLES.get(s, \"bold white\")\n", | |
| " return f\"[{style}]{s}[/{style}]\"\n", | |
| "\n", | |
| "console.print(\"[green]Ready[/green]\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "I1gQy88s04Nx" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# ── Data loading ──────────────────────────────────────────────────────────────\n", | |
| "#\n", | |
| "# Accepts:\n", | |
| "# - A single ConflictBundle JSON object { \"conflict\": ..., \"items\": ..., \"diffs\": ... }\n", | |
| "# - A JSON array of ConflictBundles [ { ... }, { ... } ]\n", | |
| "# - Multi-bundle text output ==== Conflict Bundle ====\\n{ ... }\n", | |
| "\n", | |
| "def parse_bundles(text: str) -> list[dict]:\n", | |
| " \"\"\"Parse conflict bundles from any supported format.\"\"\"\n", | |
| " text = text.strip()\n", | |
| " if text.startswith(\"{\"):\n", | |
| " return [json.loads(text)]\n", | |
| " if text.startswith(\"[\"):\n", | |
| " return json.loads(text)\n", | |
| " # Multi-bundle text format (\\s* tolerates \\r\\n and missing trailing newline)\n", | |
| " blocks = re.findall(\n", | |
| " r\"==== Conflict Bundle ====\\s*(\\{.*?\\})\\s*(?====|\\Z)\", text, re.DOTALL\n", | |
| " )\n", | |
| " return [json.loads(b) for b in blocks]\n", | |
| "\n", | |
| "\n", | |
| "def dedupe(bundles: list[dict]) -> list[dict]:\n", | |
| " seen = set()\n", | |
| " out = []\n", | |
| " for b in bundles:\n", | |
| " fp = b[\"conflict\"][\"fingerprint\"]\n", | |
| " if fp not in seen:\n", | |
| " seen.add(fp)\n", | |
| " out.append(b)\n", | |
| " return out" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "VZmfn8m404Nx" | |
| }, | |
| "outputs": [], | |
| "source": [ | |
| "# ── Load conflicts ────────────────────────────────────────────────────────────\n", | |
| "#\n", | |
| "# Supports conflict JSON in any format:\n", | |
| "# - Single bundle: { \"conflict\": ..., \"items\": ..., \"diffs\": ... }\n", | |
| "# - Array: [ { ... }, { ... } ]\n", | |
| "# - output.txt: ==== Conflict Bundle ====\\n{ ... }\n", | |
| "\n", | |
| "# Detect environment\n", | |
| "try:\n", | |
| " from google.colab import files as _colab_files\n", | |
| " _IN_COLAB = True\n", | |
| "except ImportError:\n", | |
| " _IN_COLAB = False\n", | |
| "\n", | |
| "# ── Default: fetch output.txt from gist ──\n", | |
| "SAMPLE_URL = \"https://gist.githubusercontent.com/sxalexander/9c1645e0905e4dea23bf386e9ab9888d/raw/output.txt\"\n", | |
| "\n", | |
| "SAMPLE = []\n", | |
| "\n", | |
| "# 1. Try URL first (works everywhere, no blocking)\n", | |
| "try:\n", | |
| " import urllib.request\n", | |
| " text = urllib.request.urlopen(SAMPLE_URL).read().decode()\n", | |
| " SAMPLE.extend(parse_bundles(text))\n", | |
| " console.print(f\" [green]+[/green] fetched from gist\")\n", | |
| "except Exception:\n", | |
| " pass\n", | |
| "\n", | |
| "# 2. Local files (jupyter lab)\n", | |
| "if not _IN_COLAB:\n", | |
| " CONFLICT_FILES = [\n", | |
| " Path(\"~/Downloads/output.txt\").expanduser(),\n", | |
| " Path(\"~/Downloads/conflicts.json\").expanduser(),\n", | |
| " ]\n", | |
| " for f in CONFLICT_FILES:\n", | |
| " if f.exists():\n", | |
| " SAMPLE.extend(parse_bundles(f.read_text()))\n", | |
| " console.print(f\" [green]+[/green] {f.name}\")\n", | |
| "\n", | |
| "BUNDLES = dedupe(SAMPLE)\n", | |
| "console.print(f\"\\n[bold green]{len(BUNDLES)}[/] unique entities loaded\")\n", | |
| "\n", | |
| "if not BUNDLES:\n", | |
| " console.print(\"[yellow]No data. Set UPLOAD = True in next cell to upload files.[/yellow]\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# ── (Optional) Upload your own conflicts ──────────────────────────────────────\n", | |
| "# Set UPLOAD = True, then run THIS cell to upload. Safe to skip on Run All.\n", | |
| "\n", | |
| "UPLOAD = False # <-- flip to True, then run this cell\n", | |
| "\n", | |
| "if UPLOAD and _IN_COLAB:\n", | |
| " uploaded = _colab_files.upload()\n", | |
| " for name, content in uploaded.items():\n", | |
| " SAMPLE.extend(parse_bundles(content.decode()))\n", | |
| " console.print(f\" [green]+[/green] {name}\")\n", | |
| " BUNDLES = dedupe(SAMPLE)\n", | |
| " console.print(f\"[bold green]{len(BUNDLES)}[/] unique entities loaded\")\n", | |
| "else:\n", | |
| " console.print(\"[dim]Skipped upload — using gist data. Set UPLOAD = True to add files.[/dim]\")" | |
| ], | |
| "metadata": { | |
| "id": "A8XF8FK-04Nx" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "Kudq8NzD04Nx", | |
| "outputId": "54f249cb-9e3e-4958-b493-0b316efd9110" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">44</span> anchor-level diffs across <span style=\"color: #008080; text-decoration-color: #008080; font-weight: bold\">3</span> entities\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[1;36m44\u001b[0m anchor-level diffs across \u001b[1;36m3\u001b[0m entities\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# ── Flatten to polars ─────────────────────────────────────────────────────────\n", | |
| "\n", | |
| "def flatten_diffs(bundles: list[dict]) -> pl.DataFrame:\n", | |
| " rows = []\n", | |
| " for b in bundles:\n", | |
| " entity = b[\"conflict\"][\"entityRelPath\"]\n", | |
| " entity_type = b[\"conflict\"][\"entityType\"]\n", | |
| " sources = [item[\"sourceId\"] for item in b[\"items\"]]\n", | |
| " for d in b[\"diffs\"]:\n", | |
| " present = set()\n", | |
| " for defn in d[\"preview\"][\"definitions\"]:\n", | |
| " present.update(defn[\"sources\"])\n", | |
| " diff_kind = d[\"preview\"][\"diff\"][\"kind\"]\n", | |
| " missing = d[\"preview\"][\"diff\"].get(\"missingSourceIds\", [])\n", | |
| " row = {\n", | |
| " \"entity\": entity,\n", | |
| " \"entity_type\": entity_type,\n", | |
| " \"anchor\": d[\"anchor\"],\n", | |
| " \"verdict\": d[\"verdict\"],\n", | |
| " \"delta_count\": d[\"deltaCount\"],\n", | |
| " \"diff_kind\": diff_kind,\n", | |
| " \"summary\": d[\"diffSummary\"],\n", | |
| " \"present_in\": \",\".join(sorted(present)),\n", | |
| " \"missing_in\": \",\".join(sorted(missing)),\n", | |
| " }\n", | |
| " for s in sources:\n", | |
| " row[s] = (s not in missing) if diff_kind == \"MISSING_SOURCES\" else (s in present)\n", | |
| " rows.append(row)\n", | |
| " return pl.DataFrame(rows)\n", | |
| "\n", | |
| "df = flatten_diffs(BUNDLES)\n", | |
| "console.print(f\"[bold]{df.height}[/] anchor-level diffs across [bold]{df['entity'].n_unique()}[/] entities\")" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "FkcSAN4-04Nx" | |
| }, | |
| "source": [ | |
| "---\n", | |
| "## Level 1 — Entity Queue" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "Q6L-ROJ204Nx", | |
| "outputId": "1be45a76-1023-4626-8df9-c3f01f4f4df2" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\"> Entity Queue </span>\n", | |
| "╭──────────────┬───────────┬──────────────────────────┬───────┬───────────┬─────────╮\n", | |
| "│<span style=\"font-weight: bold\"> Entity </span>│<span style=\"font-weight: bold\"> Type </span>│<span style=\"font-weight: bold\"> Sources </span>│<span style=\"font-weight: bold\"> Diffs </span>│<span style=\"font-weight: bold\"> DIFFERENT </span>│<span style=\"font-weight: bold\"> MISSING </span>│\n", | |
| "├──────────────┼───────────┼──────────────────────────┼───────┼───────────┼─────────┤\n", | |
| "│<span style=\"font-weight: bold\"> button.react </span>│<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> component </span>│ <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">KNAPSACK</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">STORYBOOK</span> │ 9 │<span style=\"color: #800000; text-decoration-color: #800000\"> 5 </span>│<span style=\"color: #808000; text-decoration-color: #808000\"> 4 </span>│\n", | |
| "├──────────────┼───────────┼──────────────────────────┼───────┼───────────┼─────────┤\n", | |
| "│<span style=\"font-weight: bold\"> card.react </span>│<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> component </span>│ <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">KNAPSACK</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">STORYBOOK</span> │ 11 │<span style=\"color: #800000; text-decoration-color: #800000\"> 4 </span>│<span style=\"color: #808000; text-decoration-color: #808000\"> 7 </span>│\n", | |
| "├──────────────┼───────────┼──────────────────────────┼───────┼───────────┼─────────┤\n", | |
| "│<span style=\"font-weight: bold\"> modal.react </span>│<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> component </span>│ <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">FIGMA</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">KNAPSACK</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">STORYBOOK</span> │ 24 │<span style=\"color: #800000; text-decoration-color: #800000\"> 3 </span>│<span style=\"color: #808000; text-decoration-color: #808000\"> 21 </span>│\n", | |
| "╰──────────────┴───────────┴──────────────────────────┴───────┴───────────┴─────────╯\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[3m Entity Queue \u001b[0m\n", | |
| "╭──────────────┬───────────┬──────────────────────────┬───────┬───────────┬─────────╮\n", | |
| "│\u001b[1m \u001b[0m\u001b[1mEntity \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mType \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mSources \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mDiffs\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mDIFFERENT\u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mMISSING\u001b[0m\u001b[1m \u001b[0m│\n", | |
| "├──────────────┼───────────┼──────────────────────────┼───────┼───────────┼─────────┤\n", | |
| "│\u001b[1m \u001b[0m\u001b[1mbutton.react\u001b[0m\u001b[1m \u001b[0m│\u001b[2m \u001b[0m\u001b[2mcomponent\u001b[0m\u001b[2m \u001b[0m│ \u001b[1;34mKNAPSACK\u001b[0m \u001b[1;33mSTORYBOOK\u001b[0m │ 9 │\u001b[31m \u001b[0m\u001b[31m 5\u001b[0m\u001b[31m \u001b[0m│\u001b[33m \u001b[0m\u001b[33m 4\u001b[0m\u001b[33m \u001b[0m│\n", | |
| "├──────────────┼───────────┼──────────────────────────┼───────┼───────────┼─────────┤\n", | |
| "│\u001b[1m \u001b[0m\u001b[1mcard.react \u001b[0m\u001b[1m \u001b[0m│\u001b[2m \u001b[0m\u001b[2mcomponent\u001b[0m\u001b[2m \u001b[0m│ \u001b[1;34mKNAPSACK\u001b[0m \u001b[1;33mSTORYBOOK\u001b[0m │ 11 │\u001b[31m \u001b[0m\u001b[31m 4\u001b[0m\u001b[31m \u001b[0m│\u001b[33m \u001b[0m\u001b[33m 7\u001b[0m\u001b[33m \u001b[0m│\n", | |
| "├──────────────┼───────────┼──────────────────────────┼───────┼───────────┼─────────┤\n", | |
| "│\u001b[1m \u001b[0m\u001b[1mmodal.react \u001b[0m\u001b[1m \u001b[0m│\u001b[2m \u001b[0m\u001b[2mcomponent\u001b[0m\u001b[2m \u001b[0m│ \u001b[1;35mFIGMA\u001b[0m \u001b[1;34mKNAPSACK\u001b[0m \u001b[1;33mSTORYBOOK\u001b[0m │ 24 │\u001b[31m \u001b[0m\u001b[31m 3\u001b[0m\u001b[31m \u001b[0m│\u001b[33m \u001b[0m\u001b[33m 21\u001b[0m\u001b[33m \u001b[0m│\n", | |
| "╰──────────────┴───────────┴──────────────────────────┴───────┴───────────┴─────────╯\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "t = Table(title=\"Entity Queue\", box=box.ROUNDED, show_lines=True)\n", | |
| "t.add_column(\"Entity\", style=\"bold\")\n", | |
| "t.add_column(\"Type\", style=\"dim\")\n", | |
| "t.add_column(\"Sources\")\n", | |
| "t.add_column(\"Diffs\", justify=\"right\")\n", | |
| "t.add_column(\"DIFFERENT\", justify=\"right\", style=\"red\")\n", | |
| "t.add_column(\"MISSING\", justify=\"right\", style=\"yellow\")\n", | |
| "\n", | |
| "for b in BUNDLES:\n", | |
| " entity = b[\"conflict\"][\"entityRelPath\"]\n", | |
| " etype = b[\"conflict\"][\"entityType\"]\n", | |
| " sources = [item[\"sourceId\"] for item in b[\"items\"]]\n", | |
| " n = len(b[\"diffs\"])\n", | |
| " n_diff = sum(1 for d in b[\"diffs\"] if d[\"verdict\"] == \"DIFFERENT\")\n", | |
| " n_miss = sum(1 for d in b[\"diffs\"] if d[\"verdict\"] == \"MISSING\")\n", | |
| " t.add_row(\n", | |
| " entity, etype.lower(),\n", | |
| " \" \".join(styled_source(s) for s in sources),\n", | |
| " str(n), str(n_diff), str(n_miss),\n", | |
| " )\n", | |
| "\n", | |
| "console.print(t)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "65I5X-Yo04Nx" | |
| }, | |
| "source": [ | |
| "---\n", | |
| "## Level 2 — Coverage Matrix\n", | |
| "\n", | |
| "For each entity: which anchors exist in which sources?\n", | |
| "\n", | |
| "- `●` present `○` absent" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "hALjMjQ304Ny", | |
| "outputId": "7eca5c19-a80a-4af7-b1aa-a9ea58fd8fd5" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\"> button.react (2 sources, 9 diffs) </span>\n", | |
| " \n", | |
| " <span style=\"font-weight: bold\">Anchor </span> <span style=\"font-weight: bold\"> KNAPSACK </span> <span style=\"font-weight: bold\"> STORYBOOK </span> <span style=\"font-weight: bold\"> Verdict </span> <span style=\"font-weight: bold\"> Detail </span> \n", | |
| " ─────────────────────────────────────────────────────────────────────────────────────────────────────── \n", | |
| " <span style=\"font-weight: bold\">#props </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (STORYBOOK vs KNAPSACK)</span> \n", | |
| " <span style=\"font-weight: bold\">#props.size </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (KNAPSACK vs STORYBOOK)</span> \n", | |
| " <span style=\"font-weight: bold\">#props.variant </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (STORYBOOK vs KNAPSACK)</span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.default </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (STORYBOOK vs KNAPSACK)</span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.with-variant </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (STORYBOOK vs KNAPSACK)</span> \n", | |
| " <span style=\"font-weight: bold\">#props.loading </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#slots.icon </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.disabled </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.loading </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " \n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[3m button.react (2 sources, 9 diffs) \u001b[0m\n", | |
| " \n", | |
| " \u001b[1mAnchor \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mKNAPSACK\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mSTORYBOOK\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mVerdict \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mDetail \u001b[0m \n", | |
| " ─────────────────────────────────────────────────────────────────────────────────────────────────────── \n", | |
| " \u001b[1m#props \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (STORYBOOK vs KNAPSACK)\u001b[0m \n", | |
| " \u001b[1m#props.size \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (KNAPSACK vs STORYBOOK)\u001b[0m \n", | |
| " \u001b[1m#props.variant \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (STORYBOOK vs KNAPSACK)\u001b[0m \n", | |
| " \u001b[1m#snippets.default \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (STORYBOOK vs KNAPSACK)\u001b[0m \n", | |
| " \u001b[1m#snippets.with-variant \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (STORYBOOK vs KNAPSACK)\u001b[0m \n", | |
| " \u001b[1m#props.loading \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#slots.icon \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#snippets.disabled \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#snippets.loading \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\"> card.react (2 sources, 11 diffs) </span>\n", | |
| " \n", | |
| " <span style=\"font-weight: bold\">Anchor </span> <span style=\"font-weight: bold\"> KNAPSACK </span> <span style=\"font-weight: bold\"> STORYBOOK </span> <span style=\"font-weight: bold\"> Verdict </span> <span style=\"font-weight: bold\"> Detail </span> \n", | |
| " ─────────────────────────────────────────────────────────────────────────────────────────────────────── \n", | |
| " <span style=\"font-weight: bold\">#description </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (KNAPSACK vs STORYBOOK)</span> \n", | |
| " <span style=\"font-weight: bold\">#props </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (STORYBOOK vs KNAPSACK)</span> \n", | |
| " <span style=\"font-weight: bold\">#props.padding </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (KNAPSACK vs STORYBOOK)</span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.default </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (STORYBOOK vs KNAPSACK)</span> \n", | |
| " <span style=\"font-weight: bold\">#props.elevation </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#props.interactive </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#slots.footer </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#slots.header </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.elevated </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.interactive </span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.no-border </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " \n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[3m card.react (2 sources, 11 diffs) \u001b[0m\n", | |
| " \n", | |
| " \u001b[1mAnchor \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mKNAPSACK\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mSTORYBOOK\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mVerdict \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mDetail \u001b[0m \n", | |
| " ─────────────────────────────────────────────────────────────────────────────────────────────────────── \n", | |
| " \u001b[1m#description \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (KNAPSACK vs STORYBOOK)\u001b[0m \n", | |
| " \u001b[1m#props \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (STORYBOOK vs KNAPSACK)\u001b[0m \n", | |
| " \u001b[1m#props.padding \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (KNAPSACK vs STORYBOOK)\u001b[0m \n", | |
| " \u001b[1m#snippets.default \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (STORYBOOK vs KNAPSACK)\u001b[0m \n", | |
| " \u001b[1m#props.elevation \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#props.interactive \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#slots.footer \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#slots.header \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#snippets.elevated \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#snippets.interactive \u001b[0m\u001b[1m \u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#snippets.no-border \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\"> modal.react (3 sources, 24 diffs) </span>\n", | |
| " \n", | |
| " <span style=\"font-weight: bold\">Anchor </span> <span style=\"font-weight: bold\"> FIGMA </span> <span style=\"font-weight: bold\"> KNAPSACK </span> <span style=\"font-weight: bold\"> STORYBOOK </span> <span style=\"font-weight: bold\"> Verdict </span> <span style=\"font-weight: bold\"> Detail </span> \n", | |
| " ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── \n", | |
| " <span style=\"font-weight: bold\">#overview </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs across 3 definitions </span> \n", | |
| " <span style=\"font-weight: bold\">#props.size </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs across 3 definitions </span> \n", | |
| " <span style=\"font-weight: bold\">#title </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #800000; text-decoration-color: #800000; font-weight: bold\">DIFFERENT</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Content differs (KNAPSACK, STORYBOOK +1)</span> \n", | |
| " <span style=\"font-weight: bold\">#accessibility </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#migration </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#props.danger </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#props.dismissible </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#props.isOpen </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#props.kind </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#props.onClose </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#props.onRequestClose </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#props.open </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#props.returnFocus </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#slots </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#slots.body </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#slots.footer </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#slots.title </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.confirm-delete </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.destructive </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.long-content </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.non-dismissible </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#snippets.scroll </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">●</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " <span style=\"font-weight: bold\">#usage </span> <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">●</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 1 source </span> \n", | |
| " <span style=\"font-weight: bold\">#usage.do-dont </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">●</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">○</span> <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">MISSING</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Missing in 2 sources </span> \n", | |
| " \n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[3m modal.react (3 sources, 24 diffs) \u001b[0m\n", | |
| " \n", | |
| " \u001b[1mAnchor \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mFIGMA \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mKNAPSACK\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mSTORYBOOK\u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mVerdict \u001b[0m\u001b[1m \u001b[0m \u001b[1m \u001b[0m\u001b[1mDetail \u001b[0m \n", | |
| " ───────────────────────────────────────────────────────────────────────────────────────────────────────────────── \n", | |
| " \u001b[1m#overview \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs across 3 definitions \u001b[0m \n", | |
| " \u001b[1m#props.size \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs across 3 definitions \u001b[0m \n", | |
| " \u001b[1m#title \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[1;34m●\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;31mDIFFERENT\u001b[0m \u001b[2m \u001b[0m\u001b[2mContent differs (KNAPSACK, STORYBOOK +1)\u001b[0m \n", | |
| " \u001b[1m#accessibility \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#migration \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#props.danger \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#props.dismissible \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#props.isOpen \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#props.kind \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#props.onClose \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#props.onRequestClose \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#props.open \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#props.returnFocus \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#slots \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#slots.body \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#slots.footer \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#slots.title \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#snippets.confirm-delete \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#snippets.destructive \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#snippets.long-content \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#snippets.non-dismissible\u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#snippets.scroll \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33m●\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \u001b[1m#usage \u001b[0m\u001b[1m \u001b[0m \u001b[1;35m●\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 1 source \u001b[0m \n", | |
| " \u001b[1m#usage.do-dont \u001b[0m\u001b[1m \u001b[0m \u001b[2m○\u001b[0m \u001b[1;34m●\u001b[0m \u001b[2m○\u001b[0m \u001b[1;33mMISSING\u001b[0m \u001b[2m \u001b[0m\u001b[2mMissing in 2 sources \u001b[0m \n", | |
| " \n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "def coverage_table(bundle: dict) -> Table:\n", | |
| " entity = bundle[\"conflict\"][\"entityRelPath\"]\n", | |
| " sources = [item[\"sourceId\"] for item in bundle[\"items\"]]\n", | |
| " diffs = sorted(bundle[\"diffs\"], key=lambda d: (d[\"verdict\"] != \"DIFFERENT\", d[\"anchor\"]))\n", | |
| "\n", | |
| " t = Table(\n", | |
| " title=f\"{entity} ({len(sources)} sources, {len(diffs)} diffs)\",\n", | |
| " box=box.SIMPLE_HEAD, show_lines=False, pad_edge=False,\n", | |
| " )\n", | |
| " t.add_column(\"Anchor\", style=\"bold\", min_width=24)\n", | |
| " for s in sources:\n", | |
| " t.add_column(s, justify=\"center\", min_width=6)\n", | |
| " t.add_column(\"Verdict\", min_width=10)\n", | |
| " t.add_column(\"Detail\", style=\"dim\", max_width=40)\n", | |
| "\n", | |
| " for d in diffs:\n", | |
| " present = set()\n", | |
| " for defn in d[\"preview\"][\"definitions\"]:\n", | |
| " present.update(defn[\"sources\"])\n", | |
| " missing = set(d[\"preview\"][\"diff\"].get(\"missingSourceIds\", []))\n", | |
| "\n", | |
| " dots = []\n", | |
| " for s in sources:\n", | |
| " has_it = (s not in missing) if d[\"preview\"][\"diff\"][\"kind\"] == \"MISSING_SOURCES\" else (s in present)\n", | |
| " style = SOURCE_STYLES.get(s, \"white\")\n", | |
| " dots.append(f\"[{style}]●[/{style}]\" if has_it else \"[dim]○[/dim]\")\n", | |
| "\n", | |
| " vs = \"bold red\" if d[\"verdict\"] == \"DIFFERENT\" else \"bold yellow\"\n", | |
| " t.add_row(d[\"anchor\"], *dots, f\"[{vs}]{d['verdict']}[/{vs}]\", d[\"diffSummary\"])\n", | |
| " return t\n", | |
| "\n", | |
| "\n", | |
| "for b in BUNDLES:\n", | |
| " console.print()\n", | |
| " console.print(coverage_table(b))\n", | |
| " console.print()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "o342xXcy04Ny" | |
| }, | |
| "source": [ | |
| "---\n", | |
| "## Summary" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "source": [ | |
| "---\n", | |
| "## Level 3 — Diff Detail\n", | |
| "\n", | |
| "Pick an entity and anchor to drill into the actual content divergence." | |
| ], | |
| "metadata": { | |
| "id": "J7AzziNq04Ny" | |
| } | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "from rich.panel import Panel\n", | |
| "from rich.columns import Columns\n", | |
| "from rich.text import Text\n", | |
| "from rich.syntax import Syntax\n", | |
| "\n", | |
| "def _lookup(entity: str, anchor: str | None = None):\n", | |
| " \"\"\"Find a bundle by entity name (fuzzy), optionally a diff by anchor.\"\"\"\n", | |
| " bundle = None\n", | |
| " for b in BUNDLES:\n", | |
| " if entity in b[\"conflict\"][\"entityRelPath\"]:\n", | |
| " bundle = b\n", | |
| " break\n", | |
| " if not bundle:\n", | |
| " console.print(f\"[red]Entity not found:[/red] {entity}\")\n", | |
| " return None, None\n", | |
| " if anchor is None:\n", | |
| " return bundle, None\n", | |
| " if not anchor.startswith(\"#\"):\n", | |
| " anchor = \"#\" + anchor\n", | |
| " for d in bundle[\"diffs\"]:\n", | |
| " if d[\"anchor\"] == anchor:\n", | |
| " return bundle, d\n", | |
| " console.print(f\"[red]Anchor not found:[/red] {anchor}\")\n", | |
| " console.print(\" Available:\", \", \".join(d[\"anchor\"] for d in bundle[\"diffs\"]))\n", | |
| " return bundle, None\n", | |
| "\n", | |
| "\n", | |
| "def show_diff(entity: str, anchor: str):\n", | |
| " \"\"\"Show a rich diff for one entity + anchor.\"\"\"\n", | |
| " bundle, diff = _lookup(entity, anchor)\n", | |
| " if not diff:\n", | |
| " return\n", | |
| "\n", | |
| " sources = [i[\"sourceId\"] for i in bundle[\"items\"]]\n", | |
| " verdict = diff[\"verdict\"]\n", | |
| " vc = \"red\" if verdict == \"DIFFERENT\" else \"yellow\"\n", | |
| "\n", | |
| " console.print()\n", | |
| " console.print(Panel(\n", | |
| " f\"[bold]{bundle['conflict']['entityRelPath']}[/bold] > [bold]{diff['anchor']}[/bold]\"\n", | |
| " f\" [{vc}]{verdict}[/{vc}]\"\n", | |
| " f\"\\n[dim]{diff['diffSummary']}[/dim]\",\n", | |
| " title=\"Diff Detail\", border_style=\"bright_blue\",\n", | |
| " ))\n", | |
| "\n", | |
| " # ── Definitions: what each source says ──\n", | |
| " for defn in diff[\"preview\"][\"definitions\"]:\n", | |
| " src_label = \" \".join(styled_source(s) for s in defn[\"sources\"])\n", | |
| " val = defn.get(\"value\")\n", | |
| " if val is None:\n", | |
| " console.print(Panel(\n", | |
| " f\"[dim]Content not inlined (hash: {defn['hash']})[/dim]\",\n", | |
| " title=src_label, border_style=\"dim\",\n", | |
| " ))\n", | |
| " elif val[\"kind\"] == \"TEXT\":\n", | |
| " lang = val.get(\"lang\", \"\")\n", | |
| " if lang == \"tsx\":\n", | |
| " lang = \"typescript\"\n", | |
| " body = Syntax(val[\"text\"], lang or \"text\", theme=\"monokai\", word_wrap=True) if val[\"text\"].strip() else Text(\"(empty)\", style=\"dim italic\")\n", | |
| " console.print(Panel(body, title=src_label, border_style=\"bright_white\"))\n", | |
| " elif val[\"kind\"] == \"TABLE\":\n", | |
| " tbl = Table(box=box.SIMPLE, show_lines=False, pad_edge=False)\n", | |
| " for col in val[\"table\"][\"columns\"]:\n", | |
| " tbl.add_column(col)\n", | |
| " for row in val[\"table\"][\"rows\"]:\n", | |
| " tbl.add_row(*(row.get(c, \"\") for c in val[\"table\"][\"columns\"]))\n", | |
| " console.print(Panel(tbl, title=src_label, border_style=\"bright_white\"))\n", | |
| "\n", | |
| " # ── Diff payload ──\n", | |
| " payload = diff[\"preview\"][\"diff\"]\n", | |
| " kind = payload[\"kind\"]\n", | |
| "\n", | |
| " if kind == \"MISSING_SOURCES\":\n", | |
| " missing = payload[\"missingSourceIds\"]\n", | |
| " present = set()\n", | |
| " for defn in diff[\"preview\"][\"definitions\"]:\n", | |
| " present.update(defn[\"sources\"])\n", | |
| " t = Text()\n", | |
| " t.append(\"Present: \", style=\"bold\")\n", | |
| " t.append(\", \".join(sorted(present)), style=\"green\")\n", | |
| " t.append(\" Missing: \", style=\"bold\")\n", | |
| " t.append(\", \".join(missing), style=\"red bold\")\n", | |
| " console.print(Panel(t, title=\"Coverage\", border_style=\"yellow\"))\n", | |
| "\n", | |
| " elif kind == \"TEXT_UNIFIED\":\n", | |
| " for patch in payload[\"patches\"]:\n", | |
| " lines = patch[\"text\"].split(\"\\\\n\") if \"\\\\n\" in patch[\"text\"] else patch[\"text\"].splitlines()\n", | |
| " rich_lines = Text()\n", | |
| " for line in lines:\n", | |
| " if line.startswith(\"-\"):\n", | |
| " rich_lines.append(line + \"\\n\", style=\"red\")\n", | |
| " elif line.startswith(\"+\"):\n", | |
| " rich_lines.append(line + \"\\n\", style=\"green\")\n", | |
| " else:\n", | |
| " rich_lines.append(line + \"\\n\", style=\"dim\")\n", | |
| " console.print(Panel(rich_lines, title=\"Unified Diff\", border_style=\"magenta\"))\n", | |
| "\n", | |
| " elif kind == \"TABLE_DELTA\":\n", | |
| " for entry in payload[\"deltas\"]:\n", | |
| " delta = entry[\"delta\"]\n", | |
| " t = Text()\n", | |
| " if delta.get(\"added\"):\n", | |
| " t.append(\"+ Added rows: \", style=\"green bold\")\n", | |
| " t.append(\", \".join(delta[\"added\"]) + \"\\n\", style=\"green\")\n", | |
| " if delta.get(\"removed\"):\n", | |
| " t.append(\"- Removed rows: \", style=\"red bold\")\n", | |
| " t.append(\", \".join(delta[\"removed\"]) + \"\\n\", style=\"red\")\n", | |
| " if delta.get(\"changed\"):\n", | |
| " t.append(\"~ Changed rows: \", style=\"yellow bold\")\n", | |
| " t.append(\", \".join(delta[\"changed\"]) + \"\\n\", style=\"yellow\")\n", | |
| " console.print(Panel(t, title=\"Table Delta\", border_style=\"magenta\"))\n", | |
| "\n", | |
| "\n", | |
| "def show_entity(entity: str):\n", | |
| " \"\"\"Show all diffs for an entity.\"\"\"\n", | |
| " bundle, _ = _lookup(entity)\n", | |
| " if not bundle:\n", | |
| " return\n", | |
| " for d in bundle[\"diffs\"]:\n", | |
| " show_diff(entity, d[\"anchor\"])" | |
| ], | |
| "metadata": { | |
| "id": "EM4nqWeg04Ny" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "source": [ | |
| "# Try it: show_diff(\"modal\", \"#props.size\") or show_diff(\"button\", \"#props\")\n", | |
| "show_diff(\"modal\", \"#overview\")" | |
| ], | |
| "metadata": { | |
| "id": "Gh6QqlYE04Ny" | |
| }, | |
| "execution_count": null, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "ZSGGapqB04Ny", | |
| "outputId": "0f84d5f3-9258-4580-e5ee-bb2fb84e9205" | |
| }, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Verdict breakdown per entity</span>\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[1mVerdict breakdown per entity\u001b[0m\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "shape: (3, 3)\n", | |
| "┌──────────────┬─────────┬───────────┐\n", | |
| "│ entity ┆ MISSING ┆ DIFFERENT │\n", | |
| "│ --- ┆ --- ┆ --- │\n", | |
| "│ str ┆ u32 ┆ u32 │\n", | |
| "╞══════════════╪═════════╪═══════════╡\n", | |
| "│ button.react ┆ 4 ┆ 5 │\n", | |
| "│ card.react ┆ 7 ┆ 4 │\n", | |
| "│ modal.react ┆ 21 ┆ 3 │\n", | |
| "└──────────────┴─────────┴───────────┘\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Diff kind x verdict</span>\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[1mDiff kind x verdict\u001b[0m\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "shape: (3, 3)\n", | |
| "┌─────────────────┬───────────┬─────┐\n", | |
| "│ diff_kind ┆ verdict ┆ len │\n", | |
| "│ --- ┆ --- ┆ --- │\n", | |
| "│ str ┆ str ┆ u32 │\n", | |
| "╞═════════════════╪═══════════╪═════╡\n", | |
| "│ MISSING_SOURCES ┆ MISSING ┆ 32 │\n", | |
| "│ TEXT_UNIFIED ┆ DIFFERENT ┆ 10 │\n", | |
| "│ TABLE_DELTA ┆ DIFFERENT ┆ 2 │\n", | |
| "└─────────────────┴───────────┴─────┘\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-style: italic\"> Source Richness </span>\n", | |
| "╭───────────┬─────────────╮\n", | |
| "│<span style=\"font-weight: bold\"> Source </span>│<span style=\"font-weight: bold\"> Definitions </span>│\n", | |
| "├───────────┼─────────────┤\n", | |
| "│ <span style=\"color: #000080; text-decoration-color: #000080; font-weight: bold\">KNAPSACK</span> │ 33 │\n", | |
| "│ <span style=\"color: #808000; text-decoration-color: #808000; font-weight: bold\">STORYBOOK</span> │ 18 │\n", | |
| "│ <span style=\"color: #800080; text-decoration-color: #800080; font-weight: bold\">FIGMA</span> │ 10 │\n", | |
| "╰───────────┴─────────────╯\n", | |
| "</pre>\n" | |
| ], | |
| "text/plain": [ | |
| "\u001b[3m Source Richness \u001b[0m\n", | |
| "╭───────────┬─────────────╮\n", | |
| "│\u001b[1m \u001b[0m\u001b[1mSource \u001b[0m\u001b[1m \u001b[0m│\u001b[1m \u001b[0m\u001b[1mDefinitions\u001b[0m\u001b[1m \u001b[0m│\n", | |
| "├───────────┼─────────────┤\n", | |
| "│ \u001b[1;34mKNAPSACK\u001b[0m │ 33 │\n", | |
| "│ \u001b[1;33mSTORYBOOK\u001b[0m │ 18 │\n", | |
| "│ \u001b[1;35mFIGMA\u001b[0m │ 10 │\n", | |
| "╰───────────┴─────────────╯\n" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "summary = (\n", | |
| " df.group_by(\"entity\", \"verdict\")\n", | |
| " .len()\n", | |
| " .pivot(on=\"verdict\", index=\"entity\", values=\"len\")\n", | |
| " .fill_null(0)\n", | |
| " .sort(\"entity\")\n", | |
| ")\n", | |
| "console.print(\"[bold]Verdict breakdown per entity[/bold]\")\n", | |
| "print(summary)\n", | |
| "console.print()\n", | |
| "\n", | |
| "kind_dist = df.group_by(\"diff_kind\", \"verdict\").len().sort(\"len\", descending=True)\n", | |
| "console.print(\"[bold]Diff kind x verdict[/bold]\")\n", | |
| "print(kind_dist)\n", | |
| "console.print()\n", | |
| "\n", | |
| "source_counts = {}\n", | |
| "for b in BUNDLES:\n", | |
| " for d in b[\"diffs\"]:\n", | |
| " for defn in d[\"preview\"][\"definitions\"]:\n", | |
| " for s in defn[\"sources\"]:\n", | |
| " source_counts[s] = source_counts.get(s, 0) + 1\n", | |
| "\n", | |
| "t = Table(title=\"Source Richness\", box=box.ROUNDED)\n", | |
| "t.add_column(\"Source\")\n", | |
| "t.add_column(\"Definitions\", justify=\"right\")\n", | |
| "for s, c in sorted(source_counts.items(), key=lambda x: -x[1]):\n", | |
| " style = SOURCE_STYLES.get(s, \"white\")\n", | |
| " t.add_row(f\"[{style}]{s}[/{style}]\", str(c))\n", | |
| "console.print(t)" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "o-Blguqa04Ny" | |
| }, | |
| "outputs": [], | |
| "source": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": { | |
| "id": "ttn2X4Q_04Ny" | |
| }, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3 (ipykernel)", | |
| "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.9" | |
| }, | |
| "colab": { | |
| "provenance": [], | |
| "include_colab_link": true | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 0 | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Found groups: [ | |
| 'COMPONENT::button.react.mdx', | |
| 'COMPONENT::card.react.mdx', | |
| 'COMPONENT::modal.react.mdx', | |
| 'TOKEN::global.tokens.json' | |
| ] | |
| ==== Conflict Bundle ==== | |
| { | |
| "conflict": { | |
| "entityKey": "component/button.react", | |
| "entityType": "COMPONENT", | |
| "entityRelPath": "button.react", | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "createdAt": "2026-02-12T18:06:50.990Z", | |
| "updatedAt": "2026-02-12T18:06:50.990Z" | |
| }, | |
| "items": [ | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "sourceId": "KNAPSACK", | |
| "frontmatterSchemaVersion": 1, | |
| "frontmatter": { | |
| "siteId": "synthetic-test", | |
| "canonicalKey": "component/button.react", | |
| "source": "knapsack", | |
| "sourceKey": "knapsack://patterns/button", | |
| "lastIngested": "2026-02-03T12:00:00.000Z", | |
| "contentHash": "sha256:c3d4e5f6789012345678901234567890abcdef1234567890abcdef1234567ab2", | |
| "platform": "react" | |
| } | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "sourceId": "STORYBOOK", | |
| "frontmatterSchemaVersion": 1, | |
| "frontmatter": { | |
| "siteId": "synthetic-test", | |
| "canonicalKey": "component/button.react", | |
| "source": "storybook", | |
| "sourceKey": "storybook://design/story/button--default", | |
| "lastIngested": "2026-02-03T12:00:00.000Z", | |
| "contentHash": "sha256:a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456", | |
| "platform": "react" | |
| } | |
| } | |
| ], | |
| "diffs": [ | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#props", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Content differs (STORYBOOK vs KNAPSACK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "b8f9f657b26a28269d93c1cae1dd562a30b46717f91296df702f7b7b3ef69bcd", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TABLE", | |
| "table": { | |
| "columns": [ | |
| "Default", | |
| "Description", | |
| "Name", | |
| "Type" | |
| ], | |
| "keyColumn": "Name", | |
| "rows": [ | |
| { | |
| "Name": "disabled", | |
| "Type": "boolean", | |
| "Default": "false", | |
| "Description": "Whether the button is disabled" | |
| }, | |
| { | |
| "Name": "onClick", | |
| "Type": "function", | |
| "Default": "-", | |
| "Description": "Click handler callback" | |
| }, | |
| { | |
| "Name": "size", | |
| "Type": "string", | |
| "Default": "\"md\"", | |
| "Description": "The size of the button" | |
| }, | |
| { | |
| "Name": "variant", | |
| "Type": "string", | |
| "Default": "\"primary\"", | |
| "Description": "The visual style variant" | |
| } | |
| ] | |
| } | |
| } | |
| }, | |
| { | |
| "hash": "f3130da3e8ec701b6c804c30ed1943a2b91f812e882008e8a6de64d8c506145a", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TABLE", | |
| "table": { | |
| "columns": [ | |
| "Default", | |
| "Description", | |
| "Name", | |
| "Type" | |
| ], | |
| "keyColumn": "Name", | |
| "rows": [ | |
| { | |
| "Name": "disabled", | |
| "Type": "boolean", | |
| "Default": "false", | |
| "Description": "Whether the button is disabled" | |
| }, | |
| { | |
| "Name": "loading", | |
| "Type": "boolean", | |
| "Default": "false", | |
| "Description": "Shows loading spinner" | |
| }, | |
| { | |
| "Name": "onClick", | |
| "Type": "function", | |
| "Default": "-", | |
| "Description": "Click handler callback" | |
| }, | |
| { | |
| "Name": "size", | |
| "Type": "string", | |
| "Default": "\"medium\"", | |
| "Description": "The size of the button" | |
| }, | |
| { | |
| "Name": "variant", | |
| "Type": "string", | |
| "Default": "\"primary\"", | |
| "Description": "The visual style variant" | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TABLE_DELTA", | |
| "baselineHash": "b8f9f657b26a28269d93c1cae1dd562a30b46717f91296df702f7b7b3ef69bcd", | |
| "deltas": [ | |
| { | |
| "toHash": "f3130da3e8ec701b6c804c30ed1943a2b91f812e882008e8a6de64d8c506145a", | |
| "delta": { | |
| "kind": "ROW_DIFF", | |
| "added": [ | |
| "loading" | |
| ], | |
| "removed": [], | |
| "changed": [ | |
| "size" | |
| ] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "e59437c5a729380f7ecc0508ea4c52008eed063083e0e8e6c54e2841afdb09df", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#props.loading", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "1242545ff8e564f1997882243e4dc4730086d4c4a1f7ca89c7d1b1c1bf2d197e", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "974abd78d52396335a2938c843e70d769e855dfe7b0aa01b52e4f26eb651dccd", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#props.size", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs (KNAPSACK vs STORYBOOK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "16f2ae5b346ea69706d8eb05b396be19e85085053be645e35d12736b0dc09950", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Controls the size of the button.\n\n**Allowed values:** `small`, `medium`, `large`", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "2cacdc8f87ddef2baffa2dfaedf5fbccba2a6a6d4cb3df045bb55eec42bd7959", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Controls the size of the button.\n\n**Allowed values:** `sm`, `md`, `lg`", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "16f2ae5b346ea69706d8eb05b396be19e85085053be645e35d12736b0dc09950", | |
| "patches": [ | |
| { | |
| "toHash": "2cacdc8f87ddef2baffa2dfaedf5fbccba2a6a6d4cb3df045bb55eec42bd7959", | |
| "text": "===================================================================\n--- KNAPSACK:#props.size\t\n+++ STORYBOOK:#props.size\t\n@@ -1,3 +1,3 @@\n Controls the size of the button.\n \n-**Allowed values:** `small`, `medium`, `large`\n\\ No newline at end of file\n+**Allowed values:** `sm`, `md`, `lg`\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "d61665467cadd42ea25a7cdac007a4c1738c62491531662f4b8e7846fd1f2f61", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#props.variant", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs (STORYBOOK vs KNAPSACK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "d90ee977ab039513140b9c7dd65f49e347f619ce5bb8b6885a5074e2856c122e", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Controls the visual appearance of the button.\n\n**Allowed values:** `primary`, `secondary`", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "dbfe8be6afb1d9a23341c6cda9f83bfa563592202701e3d37635b1d91d6ed1ce", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Controls the visual appearance of the button.\n\n**Allowed values:** `primary`, `secondary`, `danger`", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "d90ee977ab039513140b9c7dd65f49e347f619ce5bb8b6885a5074e2856c122e", | |
| "patches": [ | |
| { | |
| "toHash": "dbfe8be6afb1d9a23341c6cda9f83bfa563592202701e3d37635b1d91d6ed1ce", | |
| "text": "===================================================================\n--- STORYBOOK:#props.variant\t\n+++ KNAPSACK:#props.variant\t\n@@ -1,3 +1,3 @@\n Controls the visual appearance of the button.\n \n-**Allowed values:** `primary`, `secondary`\n\\ No newline at end of file\n+**Allowed values:** `primary`, `secondary`, `danger`\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "91d8a36aa0784405538ce2f1cfab49f78d8e9e7f26d80549bdc8a17a114a86a5", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#slots.icon", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "9c253952f8b761e2455f281ef72f1e25466dd11dd2392e7dec710e56a7de5a46", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "2a0146c66192db7b82c2853d21c32b61b19c6d23b590d1e23a3768e30b4155b7", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#snippets.default", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs (STORYBOOK vs KNAPSACK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "831baaaf87331f052714a0117c71ffb02be9d7f8ea99296a133628a95af325d6", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "<Button>Click</Button>", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "dcf2cd37f518dd69343b29b2126fa978323a677f87d2b86f16d1e7ad0733e8e2", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "<Button variant=\"primary\">Click me</Button>", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "831baaaf87331f052714a0117c71ffb02be9d7f8ea99296a133628a95af325d6", | |
| "patches": [ | |
| { | |
| "toHash": "dcf2cd37f518dd69343b29b2126fa978323a677f87d2b86f16d1e7ad0733e8e2", | |
| "text": "===================================================================\n--- STORYBOOK:#snippets.default\t\n+++ KNAPSACK:#snippets.default\t\n@@ -1,1 +1,1 @@\n-<Button>Click</Button>\n\\ No newline at end of file\n+<Button variant=\"primary\">Click me</Button>\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "d866db45d10a821740006c288d288e0ed060d9647dacf4cf35f16316b9b318fd", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#snippets.disabled", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "cebb4b02d2aa40a48b4a4c9a408aa1ad0015dc64e49b5404c6daaa248f804e20", | |
| "sources": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "783c63b951150e743ae8840533c4aae0e587408ee90b15b8a3ffda09d6a0d97a", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#snippets.loading", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "68e24701bd6afa1d0bc37442125798b38f0ecadbed34c037c976ca2760be2967", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "9d7d913a6db7f8ca8dbe451de77dab216732d243c84c718fd7eaa166a95cfd72", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_08cb0ec6fa7890be6f7973f5cc05dd28794430fe3ef045146f2cc534f79e00dc", | |
| "anchor": "#snippets.with-variant", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs (STORYBOOK vs KNAPSACK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "7ebfa1911bed59de13cdea0d2b960a8fa1efc3866ae92567977126b7df516831", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "<Button variant=\"secondary\">Secondary</Button>", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "c4479082493ce92473cb9c66a38617e516786a7b0b68d4a3c304ed55b460893f", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "<Button variant=\"danger\">Delete</Button>", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "7ebfa1911bed59de13cdea0d2b960a8fa1efc3866ae92567977126b7df516831", | |
| "patches": [ | |
| { | |
| "toHash": "c4479082493ce92473cb9c66a38617e516786a7b0b68d4a3c304ed55b460893f", | |
| "text": "===================================================================\n--- STORYBOOK:#snippets.with-variant\t\n+++ KNAPSACK:#snippets.with-variant\t\n@@ -1,1 +1,1 @@\n-<Button variant=\"secondary\">Secondary</Button>\n\\ No newline at end of file\n+<Button variant=\"danger\">Delete</Button>\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "cfebc527dcc7cd38e00147ff62e43e8ee54a62422617b724e8e47da514dbd34a", | |
| "diffObjectKey": null | |
| } | |
| ], | |
| "truncated": false | |
| } | |
| ==== Conflict Bundle ==== | |
| { | |
| "conflict": { | |
| "entityKey": "component/card.react", | |
| "entityType": "COMPONENT", | |
| "entityRelPath": "card.react", | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "createdAt": "2026-02-12T18:06:50.993Z", | |
| "updatedAt": "2026-02-12T18:06:50.993Z" | |
| }, | |
| "items": [ | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "sourceId": "KNAPSACK", | |
| "frontmatterSchemaVersion": 1, | |
| "frontmatter": { | |
| "siteId": "synthetic-test", | |
| "canonicalKey": "component/card.react", | |
| "source": "knapsack", | |
| "sourceKey": "knapsack://patterns/card", | |
| "lastIngested": "2026-02-03T12:00:00.000Z", | |
| "contentHash": "sha256:d4e5f6789012345678901234567890abcdef1234567890abcdef1234567ab2c3", | |
| "platform": "react" | |
| } | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "sourceId": "STORYBOOK", | |
| "frontmatterSchemaVersion": 1, | |
| "frontmatter": { | |
| "siteId": "synthetic-test", | |
| "canonicalKey": "component/card.react", | |
| "source": "storybook", | |
| "sourceKey": "storybook://design/story/card--default", | |
| "lastIngested": "2026-02-03T12:00:00.000Z", | |
| "contentHash": "sha256:b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef1234567a", | |
| "platform": "react" | |
| } | |
| } | |
| ], | |
| "diffs": [ | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#description", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs (KNAPSACK vs STORYBOOK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "2d5b91d0f79016d0febba55233686d83ee2f73ef0ee2aaeaa65e1b5314383839", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "A flexible card container for grouping related content with optional elevation and interactive states.", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "e652a055930768b0863320d82ed0f2d4a9ba5a8f595dcad163fd069a14119f09", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Container for content.", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "2d5b91d0f79016d0febba55233686d83ee2f73ef0ee2aaeaa65e1b5314383839", | |
| "patches": [ | |
| { | |
| "toHash": "e652a055930768b0863320d82ed0f2d4a9ba5a8f595dcad163fd069a14119f09", | |
| "text": "===================================================================\n--- KNAPSACK:#description\t\n+++ STORYBOOK:#description\t\n@@ -1,1 +1,1 @@\n-A flexible card container for grouping related content with optional elevation and interactive states.\n\\ No newline at end of file\n+Container for content.\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "10f9103a620ea3faa02688bbee2c0e0fefdd190c63dc81f496fb68028d06b500", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#props", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Content differs (STORYBOOK vs KNAPSACK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "14c2f71dc5cc9a23b648ae4fcce84e0ec59a530c6cd4895fc55810a1b5a36ba5", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TABLE", | |
| "table": { | |
| "columns": [ | |
| "Default", | |
| "Description", | |
| "Name", | |
| "Type" | |
| ], | |
| "keyColumn": "Name", | |
| "rows": [ | |
| { | |
| "Name": "border", | |
| "Type": "boolean", | |
| "Default": "true", | |
| "Description": "Whether to show border" | |
| }, | |
| { | |
| "Name": "padding", | |
| "Type": "string", | |
| "Default": "\"md\"", | |
| "Description": "Internal padding" | |
| } | |
| ] | |
| } | |
| } | |
| }, | |
| { | |
| "hash": "e1d2e4f0e38c8caa0cd127cf12989550184a63c590e830583b218bc4660cb701", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TABLE", | |
| "table": { | |
| "columns": [ | |
| "Default", | |
| "Description", | |
| "Name", | |
| "Type" | |
| ], | |
| "keyColumn": "Name", | |
| "rows": [ | |
| { | |
| "Name": "border", | |
| "Type": "boolean", | |
| "Default": "true", | |
| "Description": "Whether to show border" | |
| }, | |
| { | |
| "Name": "elevation", | |
| "Type": "string", | |
| "Default": "\"none\"", | |
| "Description": "Shadow depth level" | |
| }, | |
| { | |
| "Name": "interactive", | |
| "Type": "boolean", | |
| "Default": "false", | |
| "Description": "Whether card is clickable" | |
| }, | |
| { | |
| "Name": "padding", | |
| "Type": "string", | |
| "Default": "\"md\"", | |
| "Description": "Internal padding" | |
| } | |
| ] | |
| } | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TABLE_DELTA", | |
| "baselineHash": "14c2f71dc5cc9a23b648ae4fcce84e0ec59a530c6cd4895fc55810a1b5a36ba5", | |
| "deltas": [ | |
| { | |
| "toHash": "e1d2e4f0e38c8caa0cd127cf12989550184a63c590e830583b218bc4660cb701", | |
| "delta": { | |
| "kind": "ROW_DIFF", | |
| "added": [ | |
| "elevation", | |
| "interactive" | |
| ], | |
| "removed": [], | |
| "changed": [] | |
| } | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "86929123c1018f7308c2ea4842b94b1f32e04f51e35670611bbfee3329e4dea1", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#props.elevation", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "60ee65f30505113b3a117b036b25ad7676fe51ae58ea149f714c4d1fac916118", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "74ec6815341e22758f4220fa4f327af60b52cce9715a159508f2f9b94ba8ae3d", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#props.interactive", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "0c968dfae13a8894d8d5fa8838ed8aa6b2cbae7f30dd552fa47d8b3f668d15a4", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "833513e481fa1c37725f976a5feef5f5b992bfa9b33c1cef6610b421c91c54f3", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#props.padding", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs (KNAPSACK vs STORYBOOK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "34fe1dc4f42c96a6134d5683f509f827b67847c05431d0a66b8f527dd2297ae7", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Controls the internal spacing of the card.\n\n**Allowed values:** `none`, `sm`, `md`, `lg`, `xl`", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "fcd235ab91bb166e50b68b2254f395aa38d90b57a4c3ffc83a66f3bf7538cdca", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Controls the internal spacing of the card.\n\n**Allowed values:** `none`, `sm`, `md`, `lg`", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "34fe1dc4f42c96a6134d5683f509f827b67847c05431d0a66b8f527dd2297ae7", | |
| "patches": [ | |
| { | |
| "toHash": "fcd235ab91bb166e50b68b2254f395aa38d90b57a4c3ffc83a66f3bf7538cdca", | |
| "text": "===================================================================\n--- KNAPSACK:#props.padding\t\n+++ STORYBOOK:#props.padding\t\n@@ -1,3 +1,3 @@\n Controls the internal spacing of the card.\n \n-**Allowed values:** `none`, `sm`, `md`, `lg`, `xl`\n\\ No newline at end of file\n+**Allowed values:** `none`, `sm`, `md`, `lg`\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "4348bff7dd5c1040d0a32165486c8215c17b4dd91eaf54eb84e9ab8d4c1013ce", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#slots.footer", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "a3119caa3cd579e4332885d8960bd3921b2e539f0be9af40d68714d3f577a777", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "3cac6b441b55d96de5226cc0eb7c275edb73fc5e8dc94ba97f4fe182e25b1a32", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#slots.header", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "48c6d9f526a49b2621e01765735644862d789304cf7d51488bf32ea0878ec079", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "f16b08949ce2cb38092d46632bf6b61364e486bac42657f8ee64d7ac86928144", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#snippets.default", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs (STORYBOOK vs KNAPSACK)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "1987615f0f4582c7769eacfea29817081c0517f1c2e8c63c1ac0bf43bfd485c4", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "<Card>\n <p>Card content</p>\n</Card>", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "bd03b0987e576ac0d7741a9bb23a51cc2c113063bfae4d6381cc1f062a6682ce", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "<Card elevation=\"low\">\n <Card.Header>\n <h3>Card Title</h3>\n </Card.Header>\n <p>Card content goes here with rich formatting.</p>\n <Card.Footer>\n <Button variant=\"primary\">Action</Button>\n </Card.Footer>\n</Card>", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "1987615f0f4582c7769eacfea29817081c0517f1c2e8c63c1ac0bf43bfd485c4", | |
| "patches": [ | |
| { | |
| "toHash": "bd03b0987e576ac0d7741a9bb23a51cc2c113063bfae4d6381cc1f062a6682ce", | |
| "text": "===================================================================\n--- STORYBOOK:#snippets.default\t\n+++ KNAPSACK:#snippets.default\t\n@@ -1,3 +1,9 @@\n-<Card>\n- <p>Card content</p>\n+<Card elevation=\"low\">\n+ <Card.Header>\n+ <h3>Card Title</h3>\n+ </Card.Header>\n+ <p>Card content goes here with rich formatting.</p>\n+ <Card.Footer>\n+ <Button variant=\"primary\">Action</Button>\n+ </Card.Footer>\n </Card>\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "47bb5a69d6c5adbe91421f54b60f22fbabda3841887c804f44d10d5cd5806422", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#snippets.elevated", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "7a6c46cf79910a002913b234f6a52bc39a82ff6c856bd206f97a045c493c8bdb", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "070eec93b75da6ea0f67979576a109dc5403db8ee4754279dbbfaa43bcb835c7", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#snippets.interactive", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "987c4a4427d99c0c8295f7627e7bfac80862350624b21ca0d12d22a0020c3ed9", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "531977e691d1e9d60cf7eb8af251c5d8cf70b5af6fa01fd90f9190499ad0d85d", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_aacc8cc38b4da67e060ffa588bd6295a8c267dffa5bf0901902dbb147094f03a", | |
| "anchor": "#snippets.no-border", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "223ead2d8126788f3d443b03e569b81b0f08e5386ca197c0d11ff75a2e5b793c", | |
| "sources": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "6506fc7698cb06425b301a49013298fe1bb9df07a6a3b56ad62bbb240d09757e", | |
| "diffObjectKey": null | |
| } | |
| ], | |
| "truncated": false | |
| } | |
| ==== Conflict Bundle ==== | |
| { | |
| "conflict": { | |
| "entityKey": "component/modal.react", | |
| "entityType": "COMPONENT", | |
| "entityRelPath": "modal.react", | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "createdAt": "2026-02-12T18:06:50.994Z", | |
| "updatedAt": "2026-02-12T18:06:50.994Z" | |
| }, | |
| "items": [ | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "sourceId": "FIGMA", | |
| "frontmatterSchemaVersion": 1, | |
| "frontmatter": { | |
| "siteId": "synthetic-test", | |
| "canonicalKey": "component/modal.react", | |
| "source": "figma", | |
| "sourceKey": "figma://patterns/modal", | |
| "lastIngested": "2026-02-03T12:00:00.000Z", | |
| "contentHash": "sha256:e5f6789012345678901234567890abcdef1234567890abcdef1234567ab2c3d4", | |
| "platform": "react" | |
| } | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "sourceId": "KNAPSACK", | |
| "frontmatterSchemaVersion": 1, | |
| "frontmatter": { | |
| "siteId": "synthetic-test", | |
| "canonicalKey": "component/modal.react", | |
| "source": "knapsack", | |
| "sourceKey": "knapsack://patterns/modal", | |
| "lastIngested": "2026-02-03T12:00:00.000Z", | |
| "contentHash": "sha256:e5f6789012345678901234567890abcdef1234567890abcdef1234567ab2c3d4", | |
| "platform": "react" | |
| } | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "sourceId": "STORYBOOK", | |
| "frontmatterSchemaVersion": 1, | |
| "frontmatter": { | |
| "siteId": "synthetic-test", | |
| "canonicalKey": "component/modal.react", | |
| "source": "storybook", | |
| "sourceKey": "storybook://patterns/modal", | |
| "lastIngested": "2026-02-03T12:00:00.000Z", | |
| "contentHash": "sha256:e5f6789012345678901234567890abcdef1234567890abcdef1234567ab2c3d4", | |
| "platform": "react" | |
| } | |
| } | |
| ], | |
| "diffs": [ | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#accessibility", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "f710b775947dce44dbeb9d2cfc3029a485d151c1bd0504a1da1180da642acd8d", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "9b2c5122d53152f187d672fac9350c41f15676deab910c0b85c1836fede9f22e", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#migration", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "0d2dde3c90d44eb373acaa8e7277cccc759444982a1542763fe1eff17f3774b0", | |
| "sources": [ | |
| "FIGMA" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "KNAPSACK", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "f5c83588b85bffe7c73eadc4e8d1676815c778b5eed4f17faf091d85397e7cb9", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#overview", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs across 3 definitions", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "a8144cc4c5fbe96bcf54824a8c4389fc8553fe7ff07ef559d15ab6fdb4e5f505", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Dialog for content.", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "b1d1175a20c3e9e9b0c8ec68de1f790b5fe9916fc572064b249adfeb41913c91", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "A dialog used to interrupt the user and capture attention for a focused task or decision.", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "c1e8fe6bc3ec7d1b3f3e20c4a82d01ab4cc31b28d0e8953e4f86c3454f0b858e", | |
| "sources": [ | |
| "FIGMA" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "This page documents the Modal component and recommended interaction patterns.", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "a8144cc4c5fbe96bcf54824a8c4389fc8553fe7ff07ef559d15ab6fdb4e5f505", | |
| "patches": [ | |
| { | |
| "toHash": "b1d1175a20c3e9e9b0c8ec68de1f790b5fe9916fc572064b249adfeb41913c91", | |
| "text": "===================================================================\n--- STORYBOOK:#overview\t\n+++ KNAPSACK:#overview\t\n@@ -1,1 +1,1 @@\n-Dialog for content.\n\\ No newline at end of file\n+A dialog used to interrupt the user and capture attention for a focused task or decision.\n\\ No newline at end of file\n" | |
| }, | |
| { | |
| "toHash": "c1e8fe6bc3ec7d1b3f3e20c4a82d01ab4cc31b28d0e8953e4f86c3454f0b858e", | |
| "text": "===================================================================\n--- STORYBOOK:#overview\t\n+++ FIGMA:#overview\t\n@@ -1,1 +1,1 @@\n-Dialog for content.\n\\ No newline at end of file\n+This page documents the Modal component and recommended interaction patterns.\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "60a97b5e90e3a74d95ea1efcc362045e504a3b6adca9d12bda16a221d2514f33", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.danger", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "00af11a4d430d4d729aacc13cff2cd013559018cce3c110fdbc0d187b4d30d12", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "0b602b49c67ea45b08c26735f46db4265c265d0e90e80f6f2d85ce491b49a374", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.dismissible", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "73950f4f1e6371aca847192fb17b07bcfa8bddc548ddda5ccebaca189fadd73b", | |
| "sources": [ | |
| "FIGMA" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "KNAPSACK", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "10de2e62669d70f115c3606237fb6449b9a60c9e1ddf79e488bf8323f0f9a058", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.isOpen", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "2505011a2d28f10814b7d57b279a6ae7e509892ec559df4b780e703a1c701b81", | |
| "sources": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "KNAPSACK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "2ec3767e27b6147e6b3b86b9649afa1aed974c913f91333a50573eae9ea0678b", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.kind", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "d6c4ddeea5cb59cd184234adf7e740cef8f665d3c0be691b9e7502d065de4e24", | |
| "sources": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "KNAPSACK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "2146ec261a573239bf0ab1ff3c681c96209797a438f5c6ff0cc9debb76e1bdcc", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.onClose", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "34d1d4436a6220e1266cd594fe116f2b5274438c3f8d68826873f9f241e2aea6", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "c0a305751f577da3794346eb9228c667ed2598b3a3fd9d94c1184e37a715c8f6", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.onRequestClose", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "fd73ce9e7f111b90b8909d1fb6d6bbbc2d753c906cf4b614292026bfd0da645d", | |
| "sources": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "KNAPSACK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "34a74dad065ba290df27fad925aacee4a110b100b643b39bcc2dc5cf81c81918", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.open", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "2505011a2d28f10814b7d57b279a6ae7e509892ec559df4b780e703a1c701b81", | |
| "sources": [ | |
| "FIGMA", | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "807650d71edf3219afb56b3323b87d019157bef89ae16949bb881f74159d788f", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.returnFocus", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "bc0908db5449d0ccb34b67f71ceaf1bbe57602dc3fc7148facc476dce0283da4", | |
| "sources": [ | |
| "FIGMA" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "KNAPSACK", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "f7d51efebcdc9a652ef0176afcde9715bfc2f5c0214136a79ee5fb5403dc003c", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#props.size", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs across 3 definitions", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "1cff234468cd821f3c7b1aba1b1ade474a414f38c249d5549ba0750800952c3d", | |
| "sources": [ | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Allowed values: `small`, `medium`, `large`", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "3965fcf32026e7065e4e644c3f0647d63861d5bbb24603e27d0bfcff193edb69", | |
| "sources": [ | |
| "FIGMA" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Allowed values: `sm`, `md`, `lg`, `xl`", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "7cac08bf98d88a629ba39ec1d5e008b165c53f3fa7c889947ecc98b6228b6ada", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Allowed values: `sm`, `md`, `lg`", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "1cff234468cd821f3c7b1aba1b1ade474a414f38c249d5549ba0750800952c3d", | |
| "patches": [ | |
| { | |
| "toHash": "3965fcf32026e7065e4e644c3f0647d63861d5bbb24603e27d0bfcff193edb69", | |
| "text": "===================================================================\n--- STORYBOOK:#props.size\t\n+++ FIGMA:#props.size\t\n@@ -1,1 +1,1 @@\n-Allowed values: `small`, `medium`, `large`\n\\ No newline at end of file\n+Allowed values: `sm`, `md`, `lg`, `xl`\n\\ No newline at end of file\n" | |
| }, | |
| { | |
| "toHash": "7cac08bf98d88a629ba39ec1d5e008b165c53f3fa7c889947ecc98b6228b6ada", | |
| "text": "===================================================================\n--- STORYBOOK:#props.size\t\n+++ KNAPSACK:#props.size\t\n@@ -1,1 +1,1 @@\n-Allowed values: `small`, `medium`, `large`\n\\ No newline at end of file\n+Allowed values: `sm`, `md`, `lg`\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "b92ec34e2927dc4f0a11b3200f1b77da4801b07c1a5f8fdd42c9402924f57401", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#slots", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "48758b3ac9639e1a7db88b9dca2c60f145f95c276791a06fb377a8f029fe7f9a", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#slots.body", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "5ba9191630808f4446eb2623943b644b520a96fd46fea67b8c6b34f3588441dc", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "662aa8f79b39cbcb0731224a2f5fd31c5aa1730049b03ec669e30a05911ded31", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#slots.footer", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "bd12b501f9cd8509261ef4c0bf5fcd09d67ec4ffaed7d8b17ba551a4540849d5", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "0b2d71ee6c4ebe7d94c208f1a97e8b7b2c693b6a2386bdb08a5c3b02a1b4998f", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#slots.title", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "81ee566c51e2843caf7b21505c068801e7f7ac2ee1f8c7c36ef997e425e25b20", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "a71cbeed413d19e04e63567ac51e97a66a415dffdb2ac5e921de9f9a6c85b5f7", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#snippets.confirm-delete", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "c9773ccd5950fe8ca5ea4e3c0f07fd9d03fc4cafe25db6e40ddd0d80d67788b3", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "e270723e8a2cb4a9609bd30cedaf46ee191d9d2c8a3d251d6ead3a1214b71130", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#snippets.destructive", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "f18b554cfca61e52d5f43b8bb728784de92c57b861beb67a195e65cb6898ff27", | |
| "sources": [ | |
| "FIGMA" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "KNAPSACK", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "77f6f3559a4642835a89523094e9c72181ef426d309ea8190d965089c67cb856", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#snippets.long-content", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "50f3da558756efd62aef94308b1b543fe84dc67fbde4a2337ce1d411554749a7", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "66a606307d34cb89f8fe63fb8f6971360bd098359e847e939658448a31944146", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#snippets.non-dismissible", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "06961b1512ad7d615563a7cff81fd3bd59b0f7be0f80f6cf06682ca470af7feb", | |
| "sources": [ | |
| "FIGMA" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "KNAPSACK", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "ea60771d14955f0821b621dedbe759438833c2258c0444bb39f06b8e59398d9d", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#snippets.scroll", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "c8877fec79f765bca8d92925addf70ca20114edcd2a60b1e5e20ef4b0c5c96b2", | |
| "sources": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "KNAPSACK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "ba2b8a6d1ea8933963a7b8c86826267bb7246bfc0998056130c10655ca448425", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#title", | |
| "verdict": "DIFFERENT", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Content differs (KNAPSACK, STORYBOOK +1)", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "bdaaa304983f9501cf55033cefe98470417a20ff455af61f4c8be046402088a6", | |
| "sources": [ | |
| "KNAPSACK", | |
| "STORYBOOK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "<Description />", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", | |
| "sources": [ | |
| "FIGMA" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "diff": { | |
| "kind": "TEXT_UNIFIED", | |
| "baselineHash": "bdaaa304983f9501cf55033cefe98470417a20ff455af61f4c8be046402088a6", | |
| "patches": [ | |
| { | |
| "toHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", | |
| "text": "===================================================================\n--- KNAPSACK:#title\t\n+++ FIGMA:#title\t\n@@ -1,1 +0,0 @@\n-<Description />\n\\ No newline at end of file\n" | |
| } | |
| ] | |
| } | |
| }, | |
| "diffHash": "1c213bce222f1edb23c400f59f79026fc11effbf7069a30b43a7f3e807ac5d92", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#usage", | |
| "verdict": "MISSING", | |
| "matchMethod": "FALLBACK", | |
| "diffSummary": "Missing in 1 source", | |
| "deltaCount": 1, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "29a27ce3f7b4e5c115bd55cad532ce6ae4a3c60fd9c1cf6b7b2480c592dab0a8", | |
| "sources": [ | |
| "KNAPSACK" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Use a Modal for critical flows that require an explicit action to continue.", | |
| "lang": "tsx" | |
| } | |
| }, | |
| { | |
| "hash": "989c35d5a0953a9f9b3667317c5d60d68fc75f9495283a983fed4631df618a49", | |
| "sources": [ | |
| "FIGMA" | |
| ], | |
| "value": { | |
| "kind": "TEXT", | |
| "text": "Prefer inline content when possible; reserve modals for decisions or multi-step tasks.", | |
| "lang": "tsx" | |
| } | |
| } | |
| ], | |
| "presentDefinitionHashes": [ | |
| "29a27ce3f7b4e5c115bd55cad532ce6ae4a3c60fd9c1cf6b7b2480c592dab0a8", | |
| "989c35d5a0953a9f9b3667317c5d60d68fc75f9495283a983fed4631df618a49" | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "725d4602214adb693019422cc7a2697dc6641f1f9dd51fdddb705eaade71db8a", | |
| "diffObjectKey": null | |
| }, | |
| { | |
| "fingerprint": "cf_v1_bba96e3b8fec9c3eab75ce81680085599ef580bf87c2c4f24e6ec2cd5bdbbc00", | |
| "anchor": "#usage.do-dont", | |
| "verdict": "MISSING", | |
| "matchMethod": "EXACT", | |
| "diffSummary": "Missing in 2 sources", | |
| "deltaCount": 2, | |
| "preview": { | |
| "definitions": [ | |
| { | |
| "hash": "b889619febab77baf7bf29e93e5d744015584de93f38081a403f8cc83fbc1b45", | |
| "sources": [ | |
| "KNAPSACK" | |
| ] | |
| } | |
| ], | |
| "diff": { | |
| "kind": "MISSING_SOURCES", | |
| "missingSourceIds": [ | |
| "FIGMA", | |
| "STORYBOOK" | |
| ] | |
| } | |
| }, | |
| "diffHash": "26c0236456f414810efb28ba4ba11b9e84b1cdd40b4fa452b657c8096cb80347", | |
| "diffObjectKey": null | |
| } | |
| ], | |
| "truncated": false | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment