[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-google-deepmind-predictingthepast":3,"mdc-41bowv-key":33,"related-repo-google-deepmind-predictingthepast":2670,"related-org-google-deepmind-predictingthepast":2781},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":31,"mdContent":32},"predictingthepast","restore and date ancient texts","Ancient text restoration, attribution, dating, contextualization, and embedding via Aeneas (Latin) \u002F Ithaca (Ancient Greek). Use when asked to \"restore\", \"attribute\", \"date\", \"contextualize\", \"find parallels\", \"where was it written\", \"when was it written\", \"embed\", or \"analyze\" an ancient text, inscription, or epigraphic document, or when the user mentions \"Aeneas\", or \"Ithaca\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"google-deepmind","Google DeepMind","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fgoogle-deepmind.png",[12,16,19],{"name":13,"slug":14,"type":15},"Research","research","tag",{"name":17,"slug":18,"type":15},"Data Analysis","data-analysis",{"name":20,"slug":21,"type":15},"History","history",2333,"https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fscience-skills","2026-07-12T07:51:47.942644",null,234,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":30},[],"GDM Science Skills to speed up agentic scientific workflows with better grounding and higher token efficiency. Integrate insights from AlphaGenome, AFDB, UniProt and 30+ other databases and tools.","https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fscience-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fpredictingthepast","---\nname: predictingthepast\ndescription: >\n  Ancient text restoration, attribution, dating, contextualization, and\n  embedding via Aeneas (Latin) \u002F Ithaca (Ancient Greek). Use when asked to\n  \"restore\", \"attribute\", \"date\", \"contextualize\", \"find parallels\",\n  \"where was it written\", \"when was it written\", \"embed\", or \"analyze\"\n  an ancient text, inscription, or epigraphic document, or when the user\n  mentions \"Aeneas\", or \"Ithaca\".\n---\n\n# Predicting The Past (Aeneas \u002F Ithaca)\n\nAeneas (Latin) and Ithaca (Ancient Greek) perform four tasks on ancient texts:\n\n1.  **Restoration** — fill missing\u002Fdamaged characters\n2.  **Attribution** — geographical + chronological origin\n3.  **Contextualization** — retrieve parallel inscriptions\n4.  **Embedding** — generate text embedding vectors\n\n## Prerequisites\n\n1.  **`uv`**: Read the `uv` skill and follow its Setup instructions to ensure\n    `uv` is installed and on PATH.\n\n2.  **User Notification**: If .licenses\u002Fpredictingthepast_LICENSE.txt does not\n    already exist in the workspace root directory then (1) prominently notify\n    the user to check the terms at\n    https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fpredictingthepast\u002Fblob\u002Fmain\u002FREADME.md#license--disclaimer,\n    and include the appropriate citation and the full dataset acknowledgement,\n    and that use of these datasets should acknowledge and cite the original data\n    sources. Then (2) create the file recording the notification text and\n    timestamp.\n\n## Core Rules\n\n-   **Self-Contained Skill**: Do NOT use web search or any external tools. Run\n    ONLY the scripts in this skill (`preprocess.py`, `run_inference.py`,\n    `visualize_results.py`). Present model output as-is — never supplement or\n    override it with external lookups.\n-   **Notification**: If this skill is used, ensure this is mentioned in the\n    output.\n\n## On First Load\n\nPresent the restoration markup characters, then ask the user for their text:\n\n-   **`?`**:\n    -   **Meaning**: Known-length gap: predict **this character**.\n    -   **Example**: `donat in ??????????rtis`\n-   **`#`**:\n    -   **Meaning**: Unknown-length gap: predict a **sequence of unknown\n        length**\n    -   **Example**: `donat in #rtis`\n-   **`-`**:\n    -   **Meaning**: Missing\u002Fdamaged character that does **not** need restoring\n    -   **Example**: `prolixin---s fecit`\n-   **`_`**:\n    -   **Meaning**: Missing section of **unknown length** that does **not**\n        need restoring\n    -   **Example**: `prolixin_s fecit`\n\nAfter presenting this list, ask the user to provide the text they want to submit\nfor analysis.\n\n## Preprocessing\n\nClean input text before inference:\n\n```bash\nuv run \u003CSKILL_DIR>\u002Fscripts\u002Fpreprocess.py \\\n    --language=latin \\\n    --input=\"raw text here...\"\n```\n\nOr from a file:\n\n```bash\nuv run \u003CSKILL_DIR>\u002Fscripts\u002Fpreprocess.py \\\n    --language=greek \\\n    --input_file=\u002Ftmp\u002Finput.txt \\\n    --output_file=\u002Ftmp\u002Fcleaned.txt\n```\n\n### What preprocessing does\n\n-   **Latin**: lowercases, converts Arabic digits and Roman numerals to `0`,\n    strips editorial brackets `[]` and `()`, removes punctuation, filters to\n    valid chars (`abcdefghiklmnopqrstuvxyz` plus `0 . - _ ? # \u003Cspace>`)\n-   **Greek**: lowercases, strips accents, converts numeral notation to `0`,\n    applies PHI cleaning (bracket normalization, sigma conversion), filters to\n    Greek alphabet (`αβγδεζηθικλμνξοπρςστυφχψωϛ` plus `0 . - _ ? # \u003Cspace>`)\n\n## Inference\n\n### Restoration Constraints\n\n-   Minimum input length: **25 chars** (pad with `-` if shorter).\n-   No consecutive `##`. No adjacent `?#` or `#?`.\n-   Spaces inside `?` sequences count toward total.\n-   If the user's text contains `#`, ask how many characters to restore and set\n    `--restore_max_len` accordingly.\n-   If the user tries to restore multiple parts of the text at once, suggest to\n    restore texts **section by section**. Suggest to focus on one damaged region\n    per query — this is faster, produces higher-quality predictions.\n\n### Pre-Flight Checks\n\nConfirm with the user before proceeding if **either** applies:\n\n1.  **Restoration complexity** — if input contains more than **10** `?`\n    characters, or uses `#` with `--restore_max_len > 10`, warn: *\"This\n    restoration involves N characters which will take approximately M minutes\n    (restoration time scales roughly linearly ~10 s per additional `?` on a\n    high-end CPU machine: 5 → ~1 min, 10 → ~2.5 min, 20 → ~5 min, 30 → ~8 min).\n    Do you want to proceed, or simplify the query first (e.g. fewer `?` marks,\n    shorter `--restore_max_len`, or restoring section by section)?\"*\n2.  **Multi-window splitting** — if the input text exceeds **750 characters**\n    and will be split into multiple windows, warn: *\"This text is N characters\n    long and will be split into W overlapping windows, each run independently.\n    This will be significantly slower. Do you want to proceed, or shorten the\n    input?\"*\n\nThese factors compound: a complex restoration across multiple windows will be\nsubstantially slower than either factor alone.\n\n### Task Selection\n\nEach task is controlled by its own flag. **At least one** must be provided:\n\n-   **`--attribute`** — geographical + chronological attribution\n-   **`--restore`** — text restoration (requires `?` or `#` in input)\n-   **`--contextualize`** — parallel inscription retrieval\n\nAny combination is valid. All three can be used together.\n\nWhen `--embedding` is provided, a text embedding vector is also generated\nalongside the other tasks.\n\n### Running Inference\n\n```bash\n# Attribution + Restoration (text with gaps)\nuv run \u003CSKILL_DIR>\u002Fscripts\u002Frun_inference.py \\\n    --language=latin \\\n    --input=\"cleaned text with ???\" \\\n    --attribute --restore \\\n    --output_json=\u002Ftmp\u002Fresults.json\n\n# Attribution + Contextualization (no gaps)\nuv run \u003CSKILL_DIR>\u002Fscripts\u002Frun_inference.py \\\n    --language=latin \\\n    --input=\"cleaned text\" \\\n    --attribute --contextualize \\\n    --output_json=\u002Ftmp\u002Fresults.json\n\n# All tasks\nuv run \u003CSKILL_DIR>\u002Fscripts\u002Frun_inference.py \\\n    --language=latin \\\n    --input=\"cleaned text with ???\" \\\n    --attribute --restore --contextualize \\\n    --output_json=\u002Ftmp\u002Fresults.json\n\n# Generate dashboard\nuv run \\\n    \u003CSKILL_DIR>\u002Fscripts\u002Fvisualize_results.py \\\n    --input=\u002Ftmp\u002Fresults.json \\\n    --output=\u002Ftmp\u002Fdashboard.html\n```\n\nOutputs are always returned to the console (JSON\u002FSummary) and must always be\nwritten to an HTML dashboard for rich visualization.\n\n**Serving HTML artifacts**: After generating **any** HTML file (the dashboard or\nany other HTML artifact you create), start a background HTTP server so the user\ncan view it in their browser. Run the server in the foreground of the background\ntask process (without trailing `&`) to prevent the process from being\nterminated. Use a random high port to avoid conflicts.\n\nIn the example below, replace `\u003CHTML_FILE>` with the absolute path of the HTML\nfile you produced (e.g. `\u002Ftmp\u002Fdashboard.html` or `C:\\tmp\\dashboard.html`).\n\nFor Linux\u002FmacOS:\n\n```bash\n# Pick an unused port and start the server as a persistent process\nHTML_FILE=\u002Ftmp\u002Fdashboard.html   # ← set to the actual HTML file path\nPORT=$(export PATH=\"$HOME\u002F.local\u002Fbin:$PATH\" && uv run python -c \"import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()\")\nFILENAME=$(basename \"$HTML_FILE\")\necho \"View URL: http:\u002F\u002Flocalhost:${PORT}\u002F${FILENAME}\"\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\" && uv run python -m http.server \"$PORT\" --bind 0.0.0.0 --directory \"$(dirname \"$HTML_FILE\")\"\n```\n\nFor Windows (PowerShell):\n\n```powershell\n# Pick an unused port and start the server as a persistent process\n$HTML_FILE = \"C:\\tmp\\dashboard.html\"   # ← set to the actual HTML file path\n$PORT = & \"$HOME\\.local\\bin\\uv\" run python -c \"import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()\"\n$FILENAME = Split-Path $HTML_FILE -Leaf\n$DIRNAME = Split-Path $HTML_FILE -Parent\nWrite-Host \"View URL: http:\u002F\u002Flocalhost:${PORT}\u002F${FILENAME}\"\n& \"$HOME\\.local\\bin\\uv\" run python -m http.server $PORT --bind 0.0.0.0 --directory $DIRNAME\n```\n\nThen provide `http:\u002F\u002Flocalhost:\u003Cport>\u002F\u003Cfilename>` (or\n`http:\u002F\u002F127.0.0.1:\u003Cport>\u002F\u003Cfilename>`) as the primary clickable link in your\nresponse. Additionally, provide `http:\u002F\u002F\u003Chostname>:\u003Cport>\u002F\u003Cfilename>` as a\nfallback link for remote setups. Do **not** give the user a raw `file:\u002F\u002F` path.\n\n### Flags\n\n-   **`--input`**: Text string (mutually exclusive with `--input_file`)\n-   **`--input_file`**: Path to UTF-8 text file\n-   **`--language`**: `latin` or `greek`\n-   **`--models_dir`**: Model files directory (default:\n    `$HOME\u002F.predictingthepast\u002Fmodels`)\n-   **`--attribute`**: Run geographical and chronological attribution\n-   **`--restore`**: Run text restoration (requires `?` or `#` in input)\n-   **`--contextualize`**: Run parallel inscription retrieval\n-   **`--contextualize_top_k`**: Number of top parallels to return (default: 10)\n-   **`--contextualize_exclude_test_valid`**: Exclude test\u002Fvalidation texts from\n    contextualization results. Filters on the internal numeric `id` (where `id %\n    10` is 3 or 4).\n-   **`--embedding`**: Generate a text embedding vector (default: off). When\n    set, the output includes an `embedding` field with the full-precision float\n    vector.\n-   **`--output_json`**: Save combined JSON to file (for `visualize_results.py`)\n-   **`--restore_beam_width`**: Number of candidate restorations to explore in\n    beam search. Higher = more thorough but slower (default: 100)\n-   **`--restore_max_len`**: Maximum total characters to restore across all `?`\n    and `#` gaps (default: 15)\n-   **`--restore_temperature`**: Sampling temperature. Lower = conservative,\n    higher = creative (default: 1.0)\n-   **`--window_overlap`**: Overlap fraction for long-text windowing (default:\n    0.33)\n\n### Long Texts (>750 characters)\n\nEach window must be between **25 and 750 characters**. If the input text exceeds\n750 characters, it is automatically split into overlapping windows (default 33%\noverlap). Each window is run through the model independently, and the\ngeographical and chronological attribution results are **averaged** across all\nwindows. Restoration and contextualization are run per-window and concatenated.\n\n### Output Format\n\nUse `--output_json` to save the combined JSON to a file. For the full\n`--output_json` format including all fields for attribution, restoration, and\ncontextualization, see [output_format.md](references\u002Foutput_format.md).\n\n### Presenting Results\n\nPresent results for **every** task requested by the user. Always generate the\nHTML dashboard, serve it via the background HTTP server described above, and\nprovide the `http:\u002F\u002F` URL as a clickable link. Format years as BCE\u002FCE.\n\n#### Restoration\n\n**Bold** the restored characters in the top prediction. Show top-10 beam-search\ncandidates in a numbered table (rank, restored text, score). Summarise the most\nsalient words (not characters) — do not dump the raw saliency array.\n\n#### Geographical Attribution\n\nShow the top 10 regions in a ranked table (rank, region, score). Highlight the\ntop-1 prediction in the narrative. Summarise the most salient words (not\ncharacters) — do not dump the raw saliency array.\n\n#### Chronological Attribution\n\nReport top year and weighted average year. Describe the distribution shape (peak\ndecade, probable range) — do not list all 160 bins. Summarise the most salient\nwords (not characters) — do not dump the raw saliency array.\n\n#### Contextualization (Parallels)\n\nUse `jp` or write your own code to extract the contextualization data from\n`--output_json`. Show the top parallels in a table (rank, ID, Trismegistos ID,\nregion, date range, score, partner link). Quote the full text of the top\nparallels from the JSON.\n\nIf the user requests a specific number of parallels, use `--contextualize_top_k`\nto control how many are returned.\n\nIf the user asks to exclude test\u002Fvalidation texts, add\n`--contextualize_exclude_test_valid`. This filters on the **internal numeric\n`id`** (where `id % 10` is 3 for test or 4 for validation).\n\n#### Embedding (when `--embedding` is set)\n\nState the vector dimensionality (384 floats).\n\n## References\n\nFor more information, see:\n[predictingthepast.com](https:\u002F\u002Fpredictingthepast.com)\n\n**IMPORTANT:** The first time you return inference results to the user, remind\nthem to cite the appropriate paper below (Ithaca for Greek, Aeneas for Latin),\nand the dataset acknowledgements below.\n\n**Ithaca** (Ancient Greek): > Assael, Y., Sommerschield, T., Shillingford, B. et\nal. Restoring and attributing ancient texts using deep neural networks. *Nature*\n603, 280–283 (2022).\n\n**Aeneas** (Latin): > Assael, Y., Sommerschield, T., Cooley, A. et al.\nContextualizing ancient texts with generative neural networks. *Nature* 645,\n141–147 (2025).\n\n### Dataset Acknowledgements\n\n**IMPORTANT:** The first time you present inference results to the user, include\nthe appropriate citation and the full dataset acknowledgement for the language\nused (see below).\n\nThe Ithaca and Aeneas projects rely on the availability of high-quality datasets\nof ancient Greek and Latin inscriptions, respectively. These datasets were built\nthrough centuries of scholarly collection and decades of digital editorial work.\n\n**Ithaca** (Ancient Greek): In particular, Ithaca draws on a 2019 version of the\nSearchable Greek Inscriptions database made available under \"Fair Use\" license\nby the Packard Humanities Institute, generously supported by David Packard:\n[inscriptions.packhum.org](https:\u002F\u002Finscriptions.packhum.org).\n\n**Aeneas** (Latin): Aeneas was trained on data from:\n\n*   **Epigraphic Database Roma (EDR)**: Made available pursuant to a Creative\n    Commons Attribution 4.0 International License (CC-BY) on\n    [Zenodo](https:\u002F\u002Fzenodo.org\u002Frecords\u002F3575495). EDR is also available at\n    [edr-edr.it](http:\u002F\u002Fwww.edr-edr.it\u002F).\n*   **Epigraphic Database Heidelberg (EDH)**: Made available pursuant to a\n    Creative Commons Attribution-ShareAlike 4.0 International License (CC-BY-SA)\n    on [Zenodo](https:\u002F\u002Fzenodo.org\u002Frecords\u002F3575155). EDH is also available at\n    [edh.ub.uni-heidelberg.de](https:\u002F\u002Fedh.ub.uni-heidelberg.de\u002F).\n*   **ETL repository for Epigraphic Database Clauss Slaby (EDCS\\_ETL)**: Made\n    available pursuant to a Creative Commons Attribution 4.0 International\n    License (CC-BY) on [Zenodo](https:\u002F\u002Fzenodo.org\u002Frecords\u002F7072337). EDCS\\_ETL\n    is also available at [manfredclauss.de](http:\u002F\u002Fwww.manfredclauss.de\u002F) and\n    [github.com\u002Fsdam-au\u002FEDCS\\_ETL](https:\u002F\u002Fgithub.com\u002Fsdam-au\u002FEDCS_ETL).\n\nThese resources bring together a large proportion of published inscriptions in a\nsearchable digital format.\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,47,53,99,106,158,164,212,218,223,418,423,429,434,531,536,611,618,701,707,713,807,813,825,916,921,927,939,997,1002,1015,1021,1454,1459,1484,1512,1517,1848,1853,1917,1960,1966,2255,2261,2280,2286,2312,2318,2338,2344,2354,2360,2365,2371,2376,2382,2401,2413,2443,2456,2461,2467,2479,2489,2506,2522,2528,2537,2542,2559,2568,2659,2664],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"predicting-the-past-aeneas-ithaca",[44],{"type":45,"value":46},"text","Predicting The Past (Aeneas \u002F Ithaca)",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"Aeneas (Latin) and Ithaca (Ancient Greek) perform four tasks on ancient texts:",{"type":39,"tag":54,"props":55,"children":56},"ol",{},[57,69,79,89],{"type":39,"tag":58,"props":59,"children":60},"li",{},[61,67],{"type":39,"tag":62,"props":63,"children":64},"strong",{},[65],{"type":45,"value":66},"Restoration",{"type":45,"value":68}," — fill missing\u002Fdamaged characters",{"type":39,"tag":58,"props":70,"children":71},{},[72,77],{"type":39,"tag":62,"props":73,"children":74},{},[75],{"type":45,"value":76},"Attribution",{"type":45,"value":78}," — geographical + chronological origin",{"type":39,"tag":58,"props":80,"children":81},{},[82,87],{"type":39,"tag":62,"props":83,"children":84},{},[85],{"type":45,"value":86},"Contextualization",{"type":45,"value":88}," — retrieve parallel inscriptions",{"type":39,"tag":58,"props":90,"children":91},{},[92,97],{"type":39,"tag":62,"props":93,"children":94},{},[95],{"type":45,"value":96},"Embedding",{"type":45,"value":98}," — generate text embedding vectors",{"type":39,"tag":100,"props":101,"children":103},"h2",{"id":102},"prerequisites",[104],{"type":45,"value":105},"Prerequisites",{"type":39,"tag":54,"props":107,"children":108},{},[109,138],{"type":39,"tag":58,"props":110,"children":111},{},[112,122,124,129,131,136],{"type":39,"tag":62,"props":113,"children":114},{},[115],{"type":39,"tag":116,"props":117,"children":119},"code",{"className":118},[],[120],{"type":45,"value":121},"uv",{"type":45,"value":123},": Read the ",{"type":39,"tag":116,"props":125,"children":127},{"className":126},[],[128],{"type":45,"value":121},{"type":45,"value":130}," skill and follow its Setup instructions to ensure\n",{"type":39,"tag":116,"props":132,"children":134},{"className":133},[],[135],{"type":45,"value":121},{"type":45,"value":137}," is installed and on PATH.",{"type":39,"tag":58,"props":139,"children":140},{},[141,146,148,156],{"type":39,"tag":62,"props":142,"children":143},{},[144],{"type":45,"value":145},"User Notification",{"type":45,"value":147},": If .licenses\u002Fpredictingthepast_LICENSE.txt does not\nalready exist in the workspace root directory then (1) prominently notify\nthe user to check the terms at\n",{"type":39,"tag":149,"props":150,"children":154},"a",{"href":151,"rel":152},"https:\u002F\u002Fgithub.com\u002Fgoogle-deepmind\u002Fpredictingthepast\u002Fblob\u002Fmain\u002FREADME.md#license--disclaimer",[153],"nofollow",[155],{"type":45,"value":151},{"type":45,"value":157},",\nand include the appropriate citation and the full dataset acknowledgement,\nand that use of these datasets should acknowledge and cite the original data\nsources. Then (2) create the file recording the notification text and\ntimestamp.",{"type":39,"tag":100,"props":159,"children":161},{"id":160},"core-rules",[162],{"type":45,"value":163},"Core Rules",{"type":39,"tag":165,"props":166,"children":167},"ul",{},[168,202],{"type":39,"tag":58,"props":169,"children":170},{},[171,176,178,184,186,192,194,200],{"type":39,"tag":62,"props":172,"children":173},{},[174],{"type":45,"value":175},"Self-Contained Skill",{"type":45,"value":177},": Do NOT use web search or any external tools. Run\nONLY the scripts in this skill (",{"type":39,"tag":116,"props":179,"children":181},{"className":180},[],[182],{"type":45,"value":183},"preprocess.py",{"type":45,"value":185},", ",{"type":39,"tag":116,"props":187,"children":189},{"className":188},[],[190],{"type":45,"value":191},"run_inference.py",{"type":45,"value":193},",\n",{"type":39,"tag":116,"props":195,"children":197},{"className":196},[],[198],{"type":45,"value":199},"visualize_results.py",{"type":45,"value":201},"). Present model output as-is — never supplement or\noverride it with external lookups.",{"type":39,"tag":58,"props":203,"children":204},{},[205,210],{"type":39,"tag":62,"props":206,"children":207},{},[208],{"type":45,"value":209},"Notification",{"type":45,"value":211},": If this skill is used, ensure this is mentioned in the\noutput.",{"type":39,"tag":100,"props":213,"children":215},{"id":214},"on-first-load",[216],{"type":45,"value":217},"On First Load",{"type":39,"tag":48,"props":219,"children":220},{},[221],{"type":45,"value":222},"Present the restoration markup characters, then ask the user for their text:",{"type":39,"tag":165,"props":224,"children":225},{},[226,276,320,366],{"type":39,"tag":58,"props":227,"children":228},{},[229,238,240],{"type":39,"tag":62,"props":230,"children":231},{},[232],{"type":39,"tag":116,"props":233,"children":235},{"className":234},[],[236],{"type":45,"value":237},"?",{"type":45,"value":239},":\n",{"type":39,"tag":165,"props":241,"children":242},{},[243,260],{"type":39,"tag":58,"props":244,"children":245},{},[246,251,253,258],{"type":39,"tag":62,"props":247,"children":248},{},[249],{"type":45,"value":250},"Meaning",{"type":45,"value":252},": Known-length gap: predict ",{"type":39,"tag":62,"props":254,"children":255},{},[256],{"type":45,"value":257},"this character",{"type":45,"value":259},".",{"type":39,"tag":58,"props":261,"children":262},{},[263,268,270],{"type":39,"tag":62,"props":264,"children":265},{},[266],{"type":45,"value":267},"Example",{"type":45,"value":269},": ",{"type":39,"tag":116,"props":271,"children":273},{"className":272},[],[274],{"type":45,"value":275},"donat in ??????????rtis",{"type":39,"tag":58,"props":277,"children":278},{},[279,288,289],{"type":39,"tag":62,"props":280,"children":281},{},[282],{"type":39,"tag":116,"props":283,"children":285},{"className":284},[],[286],{"type":45,"value":287},"#",{"type":45,"value":239},{"type":39,"tag":165,"props":290,"children":291},{},[292,306],{"type":39,"tag":58,"props":293,"children":294},{},[295,299,301],{"type":39,"tag":62,"props":296,"children":297},{},[298],{"type":45,"value":250},{"type":45,"value":300},": Unknown-length gap: predict a ",{"type":39,"tag":62,"props":302,"children":303},{},[304],{"type":45,"value":305},"sequence of unknown\nlength",{"type":39,"tag":58,"props":307,"children":308},{},[309,313,314],{"type":39,"tag":62,"props":310,"children":311},{},[312],{"type":45,"value":267},{"type":45,"value":269},{"type":39,"tag":116,"props":315,"children":317},{"className":316},[],[318],{"type":45,"value":319},"donat in #rtis",{"type":39,"tag":58,"props":321,"children":322},{},[323,332,333],{"type":39,"tag":62,"props":324,"children":325},{},[326],{"type":39,"tag":116,"props":327,"children":329},{"className":328},[],[330],{"type":45,"value":331},"-",{"type":45,"value":239},{"type":39,"tag":165,"props":334,"children":335},{},[336,352],{"type":39,"tag":58,"props":337,"children":338},{},[339,343,345,350],{"type":39,"tag":62,"props":340,"children":341},{},[342],{"type":45,"value":250},{"type":45,"value":344},": Missing\u002Fdamaged character that does ",{"type":39,"tag":62,"props":346,"children":347},{},[348],{"type":45,"value":349},"not",{"type":45,"value":351}," need restoring",{"type":39,"tag":58,"props":353,"children":354},{},[355,359,360],{"type":39,"tag":62,"props":356,"children":357},{},[358],{"type":45,"value":267},{"type":45,"value":269},{"type":39,"tag":116,"props":361,"children":363},{"className":362},[],[364],{"type":45,"value":365},"prolixin---s fecit",{"type":39,"tag":58,"props":367,"children":368},{},[369,378,379],{"type":39,"tag":62,"props":370,"children":371},{},[372],{"type":39,"tag":116,"props":373,"children":375},{"className":374},[],[376],{"type":45,"value":377},"_",{"type":45,"value":239},{"type":39,"tag":165,"props":380,"children":381},{},[382,404],{"type":39,"tag":58,"props":383,"children":384},{},[385,389,391,396,398,402],{"type":39,"tag":62,"props":386,"children":387},{},[388],{"type":45,"value":250},{"type":45,"value":390},": Missing section of ",{"type":39,"tag":62,"props":392,"children":393},{},[394],{"type":45,"value":395},"unknown length",{"type":45,"value":397}," that does ",{"type":39,"tag":62,"props":399,"children":400},{},[401],{"type":45,"value":349},{"type":45,"value":403},"\nneed restoring",{"type":39,"tag":58,"props":405,"children":406},{},[407,411,412],{"type":39,"tag":62,"props":408,"children":409},{},[410],{"type":45,"value":267},{"type":45,"value":269},{"type":39,"tag":116,"props":413,"children":415},{"className":414},[],[416],{"type":45,"value":417},"prolixin_s fecit",{"type":39,"tag":48,"props":419,"children":420},{},[421],{"type":45,"value":422},"After presenting this list, ask the user to provide the text they want to submit\nfor analysis.",{"type":39,"tag":100,"props":424,"children":426},{"id":425},"preprocessing",[427],{"type":45,"value":428},"Preprocessing",{"type":39,"tag":48,"props":430,"children":431},{},[432],{"type":45,"value":433},"Clean input text before inference:",{"type":39,"tag":435,"props":436,"children":441},"pre",{"className":437,"code":438,"language":439,"meta":440,"style":440},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","uv run \u003CSKILL_DIR>\u002Fscripts\u002Fpreprocess.py \\\n    --language=latin \\\n    --input=\"raw text here...\"\n","bash","",[442],{"type":39,"tag":116,"props":443,"children":444},{"__ignoreMap":440},[445,494,507],{"type":39,"tag":446,"props":447,"children":450},"span",{"class":448,"line":449},"line",1,[451,456,462,468,473,479,484,489],{"type":39,"tag":446,"props":452,"children":454},{"style":453},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[455],{"type":45,"value":121},{"type":39,"tag":446,"props":457,"children":459},{"style":458},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[460],{"type":45,"value":461}," run",{"type":39,"tag":446,"props":463,"children":465},{"style":464},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[466],{"type":45,"value":467}," \u003C",{"type":39,"tag":446,"props":469,"children":470},{"style":458},[471],{"type":45,"value":472},"SKILL_DI",{"type":39,"tag":446,"props":474,"children":476},{"style":475},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[477],{"type":45,"value":478},"R",{"type":39,"tag":446,"props":480,"children":481},{"style":464},[482],{"type":45,"value":483},">",{"type":39,"tag":446,"props":485,"children":486},{"style":458},[487],{"type":45,"value":488},"\u002Fscripts\u002Fpreprocess.py",{"type":39,"tag":446,"props":490,"children":491},{"style":475},[492],{"type":45,"value":493}," \\\n",{"type":39,"tag":446,"props":495,"children":497},{"class":448,"line":496},2,[498,503],{"type":39,"tag":446,"props":499,"children":500},{"style":458},[501],{"type":45,"value":502},"    --language=latin",{"type":39,"tag":446,"props":504,"children":505},{"style":475},[506],{"type":45,"value":493},{"type":39,"tag":446,"props":508,"children":510},{"class":448,"line":509},3,[511,516,521,526],{"type":39,"tag":446,"props":512,"children":513},{"style":458},[514],{"type":45,"value":515},"    --input=",{"type":39,"tag":446,"props":517,"children":518},{"style":464},[519],{"type":45,"value":520},"\"",{"type":39,"tag":446,"props":522,"children":523},{"style":458},[524],{"type":45,"value":525},"raw text here...",{"type":39,"tag":446,"props":527,"children":528},{"style":464},[529],{"type":45,"value":530},"\"\n",{"type":39,"tag":48,"props":532,"children":533},{},[534],{"type":45,"value":535},"Or from a file:",{"type":39,"tag":435,"props":537,"children":539},{"className":437,"code":538,"language":439,"meta":440,"style":440},"uv run \u003CSKILL_DIR>\u002Fscripts\u002Fpreprocess.py \\\n    --language=greek \\\n    --input_file=\u002Ftmp\u002Finput.txt \\\n    --output_file=\u002Ftmp\u002Fcleaned.txt\n",[540],{"type":39,"tag":116,"props":541,"children":542},{"__ignoreMap":440},[543,578,590,602],{"type":39,"tag":446,"props":544,"children":545},{"class":448,"line":449},[546,550,554,558,562,566,570,574],{"type":39,"tag":446,"props":547,"children":548},{"style":453},[549],{"type":45,"value":121},{"type":39,"tag":446,"props":551,"children":552},{"style":458},[553],{"type":45,"value":461},{"type":39,"tag":446,"props":555,"children":556},{"style":464},[557],{"type":45,"value":467},{"type":39,"tag":446,"props":559,"children":560},{"style":458},[561],{"type":45,"value":472},{"type":39,"tag":446,"props":563,"children":564},{"style":475},[565],{"type":45,"value":478},{"type":39,"tag":446,"props":567,"children":568},{"style":464},[569],{"type":45,"value":483},{"type":39,"tag":446,"props":571,"children":572},{"style":458},[573],{"type":45,"value":488},{"type":39,"tag":446,"props":575,"children":576},{"style":475},[577],{"type":45,"value":493},{"type":39,"tag":446,"props":579,"children":580},{"class":448,"line":496},[581,586],{"type":39,"tag":446,"props":582,"children":583},{"style":458},[584],{"type":45,"value":585},"    --language=greek",{"type":39,"tag":446,"props":587,"children":588},{"style":475},[589],{"type":45,"value":493},{"type":39,"tag":446,"props":591,"children":592},{"class":448,"line":509},[593,598],{"type":39,"tag":446,"props":594,"children":595},{"style":458},[596],{"type":45,"value":597},"    --input_file=\u002Ftmp\u002Finput.txt",{"type":39,"tag":446,"props":599,"children":600},{"style":475},[601],{"type":45,"value":493},{"type":39,"tag":446,"props":603,"children":605},{"class":448,"line":604},4,[606],{"type":39,"tag":446,"props":607,"children":608},{"style":458},[609],{"type":45,"value":610},"    --output_file=\u002Ftmp\u002Fcleaned.txt\n",{"type":39,"tag":612,"props":613,"children":615},"h3",{"id":614},"what-preprocessing-does",[616],{"type":45,"value":617},"What preprocessing does",{"type":39,"tag":165,"props":619,"children":620},{},[621,671],{"type":39,"tag":58,"props":622,"children":623},{},[624,629,631,637,639,645,647,653,655,661,663,669],{"type":39,"tag":62,"props":625,"children":626},{},[627],{"type":45,"value":628},"Latin",{"type":45,"value":630},": lowercases, converts Arabic digits and Roman numerals to ",{"type":39,"tag":116,"props":632,"children":634},{"className":633},[],[635],{"type":45,"value":636},"0",{"type":45,"value":638},",\nstrips editorial brackets ",{"type":39,"tag":116,"props":640,"children":642},{"className":641},[],[643],{"type":45,"value":644},"[]",{"type":45,"value":646}," and ",{"type":39,"tag":116,"props":648,"children":650},{"className":649},[],[651],{"type":45,"value":652},"()",{"type":45,"value":654},", removes punctuation, filters to\nvalid chars (",{"type":39,"tag":116,"props":656,"children":658},{"className":657},[],[659],{"type":45,"value":660},"abcdefghiklmnopqrstuvxyz",{"type":45,"value":662}," plus ",{"type":39,"tag":116,"props":664,"children":666},{"className":665},[],[667],{"type":45,"value":668},"0 . - _ ? # \u003Cspace>",{"type":45,"value":670},")",{"type":39,"tag":58,"props":672,"children":673},{},[674,679,681,686,688,694,695,700],{"type":39,"tag":62,"props":675,"children":676},{},[677],{"type":45,"value":678},"Greek",{"type":45,"value":680},": lowercases, strips accents, converts numeral notation to ",{"type":39,"tag":116,"props":682,"children":684},{"className":683},[],[685],{"type":45,"value":636},{"type":45,"value":687},",\napplies PHI cleaning (bracket normalization, sigma conversion), filters to\nGreek alphabet (",{"type":39,"tag":116,"props":689,"children":691},{"className":690},[],[692],{"type":45,"value":693},"αβγδεζηθικλμνξοπρςστυφχψωϛ",{"type":45,"value":662},{"type":39,"tag":116,"props":696,"children":698},{"className":697},[],[699],{"type":45,"value":668},{"type":45,"value":670},{"type":39,"tag":100,"props":702,"children":704},{"id":703},"inference",[705],{"type":45,"value":706},"Inference",{"type":39,"tag":612,"props":708,"children":710},{"id":709},"restoration-constraints",[711],{"type":45,"value":712},"Restoration Constraints",{"type":39,"tag":165,"props":714,"children":715},{},[716,735,763,775,795],{"type":39,"tag":58,"props":717,"children":718},{},[719,721,726,728,733],{"type":45,"value":720},"Minimum input length: ",{"type":39,"tag":62,"props":722,"children":723},{},[724],{"type":45,"value":725},"25 chars",{"type":45,"value":727}," (pad with ",{"type":39,"tag":116,"props":729,"children":731},{"className":730},[],[732],{"type":45,"value":331},{"type":45,"value":734}," if shorter).",{"type":39,"tag":58,"props":736,"children":737},{},[738,740,746,748,754,756,762],{"type":45,"value":739},"No consecutive ",{"type":39,"tag":116,"props":741,"children":743},{"className":742},[],[744],{"type":45,"value":745},"##",{"type":45,"value":747},". No adjacent ",{"type":39,"tag":116,"props":749,"children":751},{"className":750},[],[752],{"type":45,"value":753},"?#",{"type":45,"value":755}," or ",{"type":39,"tag":116,"props":757,"children":759},{"className":758},[],[760],{"type":45,"value":761},"#?",{"type":45,"value":259},{"type":39,"tag":58,"props":764,"children":765},{},[766,768,773],{"type":45,"value":767},"Spaces inside ",{"type":39,"tag":116,"props":769,"children":771},{"className":770},[],[772],{"type":45,"value":237},{"type":45,"value":774}," sequences count toward total.",{"type":39,"tag":58,"props":776,"children":777},{},[778,780,785,787,793],{"type":45,"value":779},"If the user's text contains ",{"type":39,"tag":116,"props":781,"children":783},{"className":782},[],[784],{"type":45,"value":287},{"type":45,"value":786},", ask how many characters to restore and set\n",{"type":39,"tag":116,"props":788,"children":790},{"className":789},[],[791],{"type":45,"value":792},"--restore_max_len",{"type":45,"value":794}," accordingly.",{"type":39,"tag":58,"props":796,"children":797},{},[798,800,805],{"type":45,"value":799},"If the user tries to restore multiple parts of the text at once, suggest to\nrestore texts ",{"type":39,"tag":62,"props":801,"children":802},{},[803],{"type":45,"value":804},"section by section",{"type":45,"value":806},". Suggest to focus on one damaged region\nper query — this is faster, produces higher-quality predictions.",{"type":39,"tag":612,"props":808,"children":810},{"id":809},"pre-flight-checks",[811],{"type":45,"value":812},"Pre-Flight Checks",{"type":39,"tag":48,"props":814,"children":815},{},[816,818,823],{"type":45,"value":817},"Confirm with the user before proceeding if ",{"type":39,"tag":62,"props":819,"children":820},{},[821],{"type":45,"value":822},"either",{"type":45,"value":824}," applies:",{"type":39,"tag":54,"props":826,"children":827},{},[828,894],{"type":39,"tag":58,"props":829,"children":830},{},[831,836,838,843,845,850,852,857,859,865,867],{"type":39,"tag":62,"props":832,"children":833},{},[834],{"type":45,"value":835},"Restoration complexity",{"type":45,"value":837}," — if input contains more than ",{"type":39,"tag":62,"props":839,"children":840},{},[841],{"type":45,"value":842},"10",{"type":45,"value":844}," ",{"type":39,"tag":116,"props":846,"children":848},{"className":847},[],[849],{"type":45,"value":237},{"type":45,"value":851},"\ncharacters, or uses ",{"type":39,"tag":116,"props":853,"children":855},{"className":854},[],[856],{"type":45,"value":287},{"type":45,"value":858}," with ",{"type":39,"tag":116,"props":860,"children":862},{"className":861},[],[863],{"type":45,"value":864},"--restore_max_len > 10",{"type":45,"value":866},", warn: ",{"type":39,"tag":868,"props":869,"children":870},"em",{},[871,873,878,880,885,887,892],{"type":45,"value":872},"\"This\nrestoration involves N characters which will take approximately M minutes\n(restoration time scales roughly linearly ~10 s per additional ",{"type":39,"tag":116,"props":874,"children":876},{"className":875},[],[877],{"type":45,"value":237},{"type":45,"value":879}," on a\nhigh-end CPU machine: 5 → ~1 min, 10 → ~2.5 min, 20 → ~5 min, 30 → ~8 min).\nDo you want to proceed, or simplify the query first (e.g. fewer ",{"type":39,"tag":116,"props":881,"children":883},{"className":882},[],[884],{"type":45,"value":237},{"type":45,"value":886}," marks,\nshorter ",{"type":39,"tag":116,"props":888,"children":890},{"className":889},[],[891],{"type":45,"value":792},{"type":45,"value":893},", or restoring section by section)?\"",{"type":39,"tag":58,"props":895,"children":896},{},[897,902,904,909,911],{"type":39,"tag":62,"props":898,"children":899},{},[900],{"type":45,"value":901},"Multi-window splitting",{"type":45,"value":903}," — if the input text exceeds ",{"type":39,"tag":62,"props":905,"children":906},{},[907],{"type":45,"value":908},"750 characters",{"type":45,"value":910},"\nand will be split into multiple windows, warn: ",{"type":39,"tag":868,"props":912,"children":913},{},[914],{"type":45,"value":915},"\"This text is N characters\nlong and will be split into W overlapping windows, each run independently.\nThis will be significantly slower. Do you want to proceed, or shorten the\ninput?\"",{"type":39,"tag":48,"props":917,"children":918},{},[919],{"type":45,"value":920},"These factors compound: a complex restoration across multiple windows will be\nsubstantially slower than either factor alone.",{"type":39,"tag":612,"props":922,"children":924},{"id":923},"task-selection",[925],{"type":45,"value":926},"Task Selection",{"type":39,"tag":48,"props":928,"children":929},{},[930,932,937],{"type":45,"value":931},"Each task is controlled by its own flag. ",{"type":39,"tag":62,"props":933,"children":934},{},[935],{"type":45,"value":936},"At least one",{"type":45,"value":938}," must be provided:",{"type":39,"tag":165,"props":940,"children":941},{},[942,956,983],{"type":39,"tag":58,"props":943,"children":944},{},[945,954],{"type":39,"tag":62,"props":946,"children":947},{},[948],{"type":39,"tag":116,"props":949,"children":951},{"className":950},[],[952],{"type":45,"value":953},"--attribute",{"type":45,"value":955}," — geographical + chronological attribution",{"type":39,"tag":58,"props":957,"children":958},{},[959,968,970,975,976,981],{"type":39,"tag":62,"props":960,"children":961},{},[962],{"type":39,"tag":116,"props":963,"children":965},{"className":964},[],[966],{"type":45,"value":967},"--restore",{"type":45,"value":969}," — text restoration (requires ",{"type":39,"tag":116,"props":971,"children":973},{"className":972},[],[974],{"type":45,"value":237},{"type":45,"value":755},{"type":39,"tag":116,"props":977,"children":979},{"className":978},[],[980],{"type":45,"value":287},{"type":45,"value":982}," in input)",{"type":39,"tag":58,"props":984,"children":985},{},[986,995],{"type":39,"tag":62,"props":987,"children":988},{},[989],{"type":39,"tag":116,"props":990,"children":992},{"className":991},[],[993],{"type":45,"value":994},"--contextualize",{"type":45,"value":996}," — parallel inscription retrieval",{"type":39,"tag":48,"props":998,"children":999},{},[1000],{"type":45,"value":1001},"Any combination is valid. All three can be used together.",{"type":39,"tag":48,"props":1003,"children":1004},{},[1005,1007,1013],{"type":45,"value":1006},"When ",{"type":39,"tag":116,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":45,"value":1012},"--embedding",{"type":45,"value":1014}," is provided, a text embedding vector is also generated\nalongside the other tasks.",{"type":39,"tag":612,"props":1016,"children":1018},{"id":1017},"running-inference",[1019],{"type":45,"value":1020},"Running Inference",{"type":39,"tag":435,"props":1022,"children":1024},{"className":437,"code":1023,"language":439,"meta":440,"style":440},"# Attribution + Restoration (text with gaps)\nuv run \u003CSKILL_DIR>\u002Fscripts\u002Frun_inference.py \\\n    --language=latin \\\n    --input=\"cleaned text with ???\" \\\n    --attribute --restore \\\n    --output_json=\u002Ftmp\u002Fresults.json\n\n# Attribution + Contextualization (no gaps)\nuv run \u003CSKILL_DIR>\u002Fscripts\u002Frun_inference.py \\\n    --language=latin \\\n    --input=\"cleaned text\" \\\n    --attribute --contextualize \\\n    --output_json=\u002Ftmp\u002Fresults.json\n\n# All tasks\nuv run \u003CSKILL_DIR>\u002Fscripts\u002Frun_inference.py \\\n    --language=latin \\\n    --input=\"cleaned text with ???\" \\\n    --attribute --restore --contextualize \\\n    --output_json=\u002Ftmp\u002Fresults.json\n\n# Generate dashboard\nuv run \\\n    \u003CSKILL_DIR>\u002Fscripts\u002Fvisualize_results.py \\\n    --input=\u002Ftmp\u002Fresults.json \\\n    --output=\u002Ftmp\u002Fdashboard.html\n",[1025],{"type":39,"tag":116,"props":1026,"children":1027},{"__ignoreMap":440},[1028,1037,1073,1084,1108,1126,1135,1145,1154,1190,1202,1227,1244,1252,1260,1269,1305,1317,1341,1361,1369,1377,1386,1402,1432,1445],{"type":39,"tag":446,"props":1029,"children":1030},{"class":448,"line":449},[1031],{"type":39,"tag":446,"props":1032,"children":1034},{"style":1033},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1035],{"type":45,"value":1036},"# Attribution + Restoration (text with gaps)\n",{"type":39,"tag":446,"props":1038,"children":1039},{"class":448,"line":496},[1040,1044,1048,1052,1056,1060,1064,1069],{"type":39,"tag":446,"props":1041,"children":1042},{"style":453},[1043],{"type":45,"value":121},{"type":39,"tag":446,"props":1045,"children":1046},{"style":458},[1047],{"type":45,"value":461},{"type":39,"tag":446,"props":1049,"children":1050},{"style":464},[1051],{"type":45,"value":467},{"type":39,"tag":446,"props":1053,"children":1054},{"style":458},[1055],{"type":45,"value":472},{"type":39,"tag":446,"props":1057,"children":1058},{"style":475},[1059],{"type":45,"value":478},{"type":39,"tag":446,"props":1061,"children":1062},{"style":464},[1063],{"type":45,"value":483},{"type":39,"tag":446,"props":1065,"children":1066},{"style":458},[1067],{"type":45,"value":1068},"\u002Fscripts\u002Frun_inference.py",{"type":39,"tag":446,"props":1070,"children":1071},{"style":475},[1072],{"type":45,"value":493},{"type":39,"tag":446,"props":1074,"children":1075},{"class":448,"line":509},[1076,1080],{"type":39,"tag":446,"props":1077,"children":1078},{"style":458},[1079],{"type":45,"value":502},{"type":39,"tag":446,"props":1081,"children":1082},{"style":475},[1083],{"type":45,"value":493},{"type":39,"tag":446,"props":1085,"children":1086},{"class":448,"line":604},[1087,1091,1095,1100,1104],{"type":39,"tag":446,"props":1088,"children":1089},{"style":458},[1090],{"type":45,"value":515},{"type":39,"tag":446,"props":1092,"children":1093},{"style":464},[1094],{"type":45,"value":520},{"type":39,"tag":446,"props":1096,"children":1097},{"style":458},[1098],{"type":45,"value":1099},"cleaned text with ???",{"type":39,"tag":446,"props":1101,"children":1102},{"style":464},[1103],{"type":45,"value":520},{"type":39,"tag":446,"props":1105,"children":1106},{"style":475},[1107],{"type":45,"value":493},{"type":39,"tag":446,"props":1109,"children":1111},{"class":448,"line":1110},5,[1112,1117,1122],{"type":39,"tag":446,"props":1113,"children":1114},{"style":458},[1115],{"type":45,"value":1116},"    --attribute",{"type":39,"tag":446,"props":1118,"children":1119},{"style":458},[1120],{"type":45,"value":1121}," --restore",{"type":39,"tag":446,"props":1123,"children":1124},{"style":475},[1125],{"type":45,"value":493},{"type":39,"tag":446,"props":1127,"children":1129},{"class":448,"line":1128},6,[1130],{"type":39,"tag":446,"props":1131,"children":1132},{"style":458},[1133],{"type":45,"value":1134},"    --output_json=\u002Ftmp\u002Fresults.json\n",{"type":39,"tag":446,"props":1136,"children":1138},{"class":448,"line":1137},7,[1139],{"type":39,"tag":446,"props":1140,"children":1142},{"emptyLinePlaceholder":1141},true,[1143],{"type":45,"value":1144},"\n",{"type":39,"tag":446,"props":1146,"children":1148},{"class":448,"line":1147},8,[1149],{"type":39,"tag":446,"props":1150,"children":1151},{"style":1033},[1152],{"type":45,"value":1153},"# Attribution + Contextualization (no gaps)\n",{"type":39,"tag":446,"props":1155,"children":1157},{"class":448,"line":1156},9,[1158,1162,1166,1170,1174,1178,1182,1186],{"type":39,"tag":446,"props":1159,"children":1160},{"style":453},[1161],{"type":45,"value":121},{"type":39,"tag":446,"props":1163,"children":1164},{"style":458},[1165],{"type":45,"value":461},{"type":39,"tag":446,"props":1167,"children":1168},{"style":464},[1169],{"type":45,"value":467},{"type":39,"tag":446,"props":1171,"children":1172},{"style":458},[1173],{"type":45,"value":472},{"type":39,"tag":446,"props":1175,"children":1176},{"style":475},[1177],{"type":45,"value":478},{"type":39,"tag":446,"props":1179,"children":1180},{"style":464},[1181],{"type":45,"value":483},{"type":39,"tag":446,"props":1183,"children":1184},{"style":458},[1185],{"type":45,"value":1068},{"type":39,"tag":446,"props":1187,"children":1188},{"style":475},[1189],{"type":45,"value":493},{"type":39,"tag":446,"props":1191,"children":1193},{"class":448,"line":1192},10,[1194,1198],{"type":39,"tag":446,"props":1195,"children":1196},{"style":458},[1197],{"type":45,"value":502},{"type":39,"tag":446,"props":1199,"children":1200},{"style":475},[1201],{"type":45,"value":493},{"type":39,"tag":446,"props":1203,"children":1205},{"class":448,"line":1204},11,[1206,1210,1214,1219,1223],{"type":39,"tag":446,"props":1207,"children":1208},{"style":458},[1209],{"type":45,"value":515},{"type":39,"tag":446,"props":1211,"children":1212},{"style":464},[1213],{"type":45,"value":520},{"type":39,"tag":446,"props":1215,"children":1216},{"style":458},[1217],{"type":45,"value":1218},"cleaned text",{"type":39,"tag":446,"props":1220,"children":1221},{"style":464},[1222],{"type":45,"value":520},{"type":39,"tag":446,"props":1224,"children":1225},{"style":475},[1226],{"type":45,"value":493},{"type":39,"tag":446,"props":1228,"children":1230},{"class":448,"line":1229},12,[1231,1235,1240],{"type":39,"tag":446,"props":1232,"children":1233},{"style":458},[1234],{"type":45,"value":1116},{"type":39,"tag":446,"props":1236,"children":1237},{"style":458},[1238],{"type":45,"value":1239}," --contextualize",{"type":39,"tag":446,"props":1241,"children":1242},{"style":475},[1243],{"type":45,"value":493},{"type":39,"tag":446,"props":1245,"children":1247},{"class":448,"line":1246},13,[1248],{"type":39,"tag":446,"props":1249,"children":1250},{"style":458},[1251],{"type":45,"value":1134},{"type":39,"tag":446,"props":1253,"children":1255},{"class":448,"line":1254},14,[1256],{"type":39,"tag":446,"props":1257,"children":1258},{"emptyLinePlaceholder":1141},[1259],{"type":45,"value":1144},{"type":39,"tag":446,"props":1261,"children":1263},{"class":448,"line":1262},15,[1264],{"type":39,"tag":446,"props":1265,"children":1266},{"style":1033},[1267],{"type":45,"value":1268},"# All tasks\n",{"type":39,"tag":446,"props":1270,"children":1272},{"class":448,"line":1271},16,[1273,1277,1281,1285,1289,1293,1297,1301],{"type":39,"tag":446,"props":1274,"children":1275},{"style":453},[1276],{"type":45,"value":121},{"type":39,"tag":446,"props":1278,"children":1279},{"style":458},[1280],{"type":45,"value":461},{"type":39,"tag":446,"props":1282,"children":1283},{"style":464},[1284],{"type":45,"value":467},{"type":39,"tag":446,"props":1286,"children":1287},{"style":458},[1288],{"type":45,"value":472},{"type":39,"tag":446,"props":1290,"children":1291},{"style":475},[1292],{"type":45,"value":478},{"type":39,"tag":446,"props":1294,"children":1295},{"style":464},[1296],{"type":45,"value":483},{"type":39,"tag":446,"props":1298,"children":1299},{"style":458},[1300],{"type":45,"value":1068},{"type":39,"tag":446,"props":1302,"children":1303},{"style":475},[1304],{"type":45,"value":493},{"type":39,"tag":446,"props":1306,"children":1308},{"class":448,"line":1307},17,[1309,1313],{"type":39,"tag":446,"props":1310,"children":1311},{"style":458},[1312],{"type":45,"value":502},{"type":39,"tag":446,"props":1314,"children":1315},{"style":475},[1316],{"type":45,"value":493},{"type":39,"tag":446,"props":1318,"children":1320},{"class":448,"line":1319},18,[1321,1325,1329,1333,1337],{"type":39,"tag":446,"props":1322,"children":1323},{"style":458},[1324],{"type":45,"value":515},{"type":39,"tag":446,"props":1326,"children":1327},{"style":464},[1328],{"type":45,"value":520},{"type":39,"tag":446,"props":1330,"children":1331},{"style":458},[1332],{"type":45,"value":1099},{"type":39,"tag":446,"props":1334,"children":1335},{"style":464},[1336],{"type":45,"value":520},{"type":39,"tag":446,"props":1338,"children":1339},{"style":475},[1340],{"type":45,"value":493},{"type":39,"tag":446,"props":1342,"children":1344},{"class":448,"line":1343},19,[1345,1349,1353,1357],{"type":39,"tag":446,"props":1346,"children":1347},{"style":458},[1348],{"type":45,"value":1116},{"type":39,"tag":446,"props":1350,"children":1351},{"style":458},[1352],{"type":45,"value":1121},{"type":39,"tag":446,"props":1354,"children":1355},{"style":458},[1356],{"type":45,"value":1239},{"type":39,"tag":446,"props":1358,"children":1359},{"style":475},[1360],{"type":45,"value":493},{"type":39,"tag":446,"props":1362,"children":1364},{"class":448,"line":1363},20,[1365],{"type":39,"tag":446,"props":1366,"children":1367},{"style":458},[1368],{"type":45,"value":1134},{"type":39,"tag":446,"props":1370,"children":1372},{"class":448,"line":1371},21,[1373],{"type":39,"tag":446,"props":1374,"children":1375},{"emptyLinePlaceholder":1141},[1376],{"type":45,"value":1144},{"type":39,"tag":446,"props":1378,"children":1380},{"class":448,"line":1379},22,[1381],{"type":39,"tag":446,"props":1382,"children":1383},{"style":1033},[1384],{"type":45,"value":1385},"# Generate dashboard\n",{"type":39,"tag":446,"props":1387,"children":1389},{"class":448,"line":1388},23,[1390,1394,1398],{"type":39,"tag":446,"props":1391,"children":1392},{"style":453},[1393],{"type":45,"value":121},{"type":39,"tag":446,"props":1395,"children":1396},{"style":458},[1397],{"type":45,"value":461},{"type":39,"tag":446,"props":1399,"children":1400},{"style":475},[1401],{"type":45,"value":493},{"type":39,"tag":446,"props":1403,"children":1405},{"class":448,"line":1404},24,[1406,1411,1415,1419,1423,1428],{"type":39,"tag":446,"props":1407,"children":1408},{"style":464},[1409],{"type":45,"value":1410},"    \u003C",{"type":39,"tag":446,"props":1412,"children":1413},{"style":458},[1414],{"type":45,"value":472},{"type":39,"tag":446,"props":1416,"children":1417},{"style":475},[1418],{"type":45,"value":478},{"type":39,"tag":446,"props":1420,"children":1421},{"style":464},[1422],{"type":45,"value":483},{"type":39,"tag":446,"props":1424,"children":1425},{"style":458},[1426],{"type":45,"value":1427},"\u002Fscripts\u002Fvisualize_results.py",{"type":39,"tag":446,"props":1429,"children":1430},{"style":475},[1431],{"type":45,"value":493},{"type":39,"tag":446,"props":1433,"children":1435},{"class":448,"line":1434},25,[1436,1441],{"type":39,"tag":446,"props":1437,"children":1438},{"style":458},[1439],{"type":45,"value":1440},"    --input=\u002Ftmp\u002Fresults.json",{"type":39,"tag":446,"props":1442,"children":1443},{"style":475},[1444],{"type":45,"value":493},{"type":39,"tag":446,"props":1446,"children":1448},{"class":448,"line":1447},26,[1449],{"type":39,"tag":446,"props":1450,"children":1451},{"style":458},[1452],{"type":45,"value":1453},"    --output=\u002Ftmp\u002Fdashboard.html\n",{"type":39,"tag":48,"props":1455,"children":1456},{},[1457],{"type":45,"value":1458},"Outputs are always returned to the console (JSON\u002FSummary) and must always be\nwritten to an HTML dashboard for rich visualization.",{"type":39,"tag":48,"props":1460,"children":1461},{},[1462,1467,1469,1474,1476,1482],{"type":39,"tag":62,"props":1463,"children":1464},{},[1465],{"type":45,"value":1466},"Serving HTML artifacts",{"type":45,"value":1468},": After generating ",{"type":39,"tag":62,"props":1470,"children":1471},{},[1472],{"type":45,"value":1473},"any",{"type":45,"value":1475}," HTML file (the dashboard or\nany other HTML artifact you create), start a background HTTP server so the user\ncan view it in their browser. Run the server in the foreground of the background\ntask process (without trailing ",{"type":39,"tag":116,"props":1477,"children":1479},{"className":1478},[],[1480],{"type":45,"value":1481},"&",{"type":45,"value":1483},") to prevent the process from being\nterminated. Use a random high port to avoid conflicts.",{"type":39,"tag":48,"props":1485,"children":1486},{},[1487,1489,1495,1497,1503,1504,1510],{"type":45,"value":1488},"In the example below, replace ",{"type":39,"tag":116,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":45,"value":1494},"\u003CHTML_FILE>",{"type":45,"value":1496}," with the absolute path of the HTML\nfile you produced (e.g. ",{"type":39,"tag":116,"props":1498,"children":1500},{"className":1499},[],[1501],{"type":45,"value":1502},"\u002Ftmp\u002Fdashboard.html",{"type":45,"value":755},{"type":39,"tag":116,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":45,"value":1509},"C:\\tmp\\dashboard.html",{"type":45,"value":1511},").",{"type":39,"tag":48,"props":1513,"children":1514},{},[1515],{"type":45,"value":1516},"For Linux\u002FmacOS:",{"type":39,"tag":435,"props":1518,"children":1520},{"className":437,"code":1519,"language":439,"meta":440,"style":440},"# Pick an unused port and start the server as a persistent process\nHTML_FILE=\u002Ftmp\u002Fdashboard.html   # ← set to the actual HTML file path\nPORT=$(export PATH=\"$HOME\u002F.local\u002Fbin:$PATH\" && uv run python -c \"import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()\")\nFILENAME=$(basename \"$HTML_FILE\")\necho \"View URL: http:\u002F\u002Flocalhost:${PORT}\u002F${FILENAME}\"\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\" && uv run python -m http.server \"$PORT\" --bind 0.0.0.0 --directory \"$(dirname \"$HTML_FILE\")\"\n",[1521],{"type":39,"tag":116,"props":1522,"children":1523},{"__ignoreMap":440},[1524,1532,1554,1648,1682,1732],{"type":39,"tag":446,"props":1525,"children":1526},{"class":448,"line":449},[1527],{"type":39,"tag":446,"props":1528,"children":1529},{"style":1033},[1530],{"type":45,"value":1531},"# Pick an unused port and start the server as a persistent process\n",{"type":39,"tag":446,"props":1533,"children":1534},{"class":448,"line":496},[1535,1540,1545,1549],{"type":39,"tag":446,"props":1536,"children":1537},{"style":475},[1538],{"type":45,"value":1539},"HTML_FILE",{"type":39,"tag":446,"props":1541,"children":1542},{"style":464},[1543],{"type":45,"value":1544},"=",{"type":39,"tag":446,"props":1546,"children":1547},{"style":458},[1548],{"type":45,"value":1502},{"type":39,"tag":446,"props":1550,"children":1551},{"style":1033},[1552],{"type":45,"value":1553},"   # ← set to the actual HTML file path\n",{"type":39,"tag":446,"props":1555,"children":1556},{"class":448,"line":509},[1557,1562,1567,1572,1577,1582,1586,1591,1596,1601,1605,1610,1615,1619,1624,1629,1634,1639,1643],{"type":39,"tag":446,"props":1558,"children":1559},{"style":475},[1560],{"type":45,"value":1561},"PORT",{"type":39,"tag":446,"props":1563,"children":1564},{"style":464},[1565],{"type":45,"value":1566},"=$(",{"type":39,"tag":446,"props":1568,"children":1569},{"style":475},[1570],{"type":45,"value":1571},"e",{"type":39,"tag":446,"props":1573,"children":1574},{"style":458},[1575],{"type":45,"value":1576},"xport",{"type":39,"tag":446,"props":1578,"children":1579},{"style":458},[1580],{"type":45,"value":1581}," PATH=",{"type":39,"tag":446,"props":1583,"children":1584},{"style":464},[1585],{"type":45,"value":520},{"type":39,"tag":446,"props":1587,"children":1588},{"style":475},[1589],{"type":45,"value":1590},"$HOME",{"type":39,"tag":446,"props":1592,"children":1593},{"style":458},[1594],{"type":45,"value":1595},"\u002F.local\u002Fbin:",{"type":39,"tag":446,"props":1597,"children":1598},{"style":475},[1599],{"type":45,"value":1600},"$PATH",{"type":39,"tag":446,"props":1602,"children":1603},{"style":464},[1604],{"type":45,"value":520},{"type":39,"tag":446,"props":1606,"children":1607},{"style":464},[1608],{"type":45,"value":1609}," &&",{"type":39,"tag":446,"props":1611,"children":1612},{"style":453},[1613],{"type":45,"value":1614}," uv",{"type":39,"tag":446,"props":1616,"children":1617},{"style":458},[1618],{"type":45,"value":461},{"type":39,"tag":446,"props":1620,"children":1621},{"style":458},[1622],{"type":45,"value":1623}," python",{"type":39,"tag":446,"props":1625,"children":1626},{"style":458},[1627],{"type":45,"value":1628}," -c",{"type":39,"tag":446,"props":1630,"children":1631},{"style":464},[1632],{"type":45,"value":1633}," \"",{"type":39,"tag":446,"props":1635,"children":1636},{"style":458},[1637],{"type":45,"value":1638},"import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()",{"type":39,"tag":446,"props":1640,"children":1641},{"style":464},[1642],{"type":45,"value":520},{"type":39,"tag":446,"props":1644,"children":1645},{"style":464},[1646],{"type":45,"value":1647},")\n",{"type":39,"tag":446,"props":1649,"children":1650},{"class":448,"line":604},[1651,1656,1660,1665,1669,1674,1678],{"type":39,"tag":446,"props":1652,"children":1653},{"style":475},[1654],{"type":45,"value":1655},"FILENAME",{"type":39,"tag":446,"props":1657,"children":1658},{"style":464},[1659],{"type":45,"value":1566},{"type":39,"tag":446,"props":1661,"children":1662},{"style":453},[1663],{"type":45,"value":1664},"basename",{"type":39,"tag":446,"props":1666,"children":1667},{"style":464},[1668],{"type":45,"value":1633},{"type":39,"tag":446,"props":1670,"children":1671},{"style":475},[1672],{"type":45,"value":1673},"$HTML_FILE",{"type":39,"tag":446,"props":1675,"children":1676},{"style":464},[1677],{"type":45,"value":520},{"type":39,"tag":446,"props":1679,"children":1680},{"style":464},[1681],{"type":45,"value":1647},{"type":39,"tag":446,"props":1683,"children":1684},{"class":448,"line":1110},[1685,1691,1695,1700,1705,1709,1714,1719,1723,1727],{"type":39,"tag":446,"props":1686,"children":1688},{"style":1687},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1689],{"type":45,"value":1690},"echo",{"type":39,"tag":446,"props":1692,"children":1693},{"style":464},[1694],{"type":45,"value":1633},{"type":39,"tag":446,"props":1696,"children":1697},{"style":458},[1698],{"type":45,"value":1699},"View URL: http:\u002F\u002Flocalhost:",{"type":39,"tag":446,"props":1701,"children":1702},{"style":464},[1703],{"type":45,"value":1704},"${",{"type":39,"tag":446,"props":1706,"children":1707},{"style":475},[1708],{"type":45,"value":1561},{"type":39,"tag":446,"props":1710,"children":1711},{"style":464},[1712],{"type":45,"value":1713},"}",{"type":39,"tag":446,"props":1715,"children":1716},{"style":458},[1717],{"type":45,"value":1718},"\u002F",{"type":39,"tag":446,"props":1720,"children":1721},{"style":464},[1722],{"type":45,"value":1704},{"type":39,"tag":446,"props":1724,"children":1725},{"style":475},[1726],{"type":45,"value":1655},{"type":39,"tag":446,"props":1728,"children":1729},{"style":464},[1730],{"type":45,"value":1731},"}\"\n",{"type":39,"tag":446,"props":1733,"children":1734},{"class":448,"line":1128},[1735,1741,1746,1750,1754,1758,1762,1766,1770,1774,1778,1782,1786,1791,1796,1800,1805,1809,1814,1820,1825,1830,1835,1839,1843],{"type":39,"tag":446,"props":1736,"children":1738},{"style":1737},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1739],{"type":45,"value":1740},"export",{"type":39,"tag":446,"props":1742,"children":1743},{"style":475},[1744],{"type":45,"value":1745}," PATH",{"type":39,"tag":446,"props":1747,"children":1748},{"style":464},[1749],{"type":45,"value":1544},{"type":39,"tag":446,"props":1751,"children":1752},{"style":464},[1753],{"type":45,"value":520},{"type":39,"tag":446,"props":1755,"children":1756},{"style":475},[1757],{"type":45,"value":1590},{"type":39,"tag":446,"props":1759,"children":1760},{"style":458},[1761],{"type":45,"value":1595},{"type":39,"tag":446,"props":1763,"children":1764},{"style":475},[1765],{"type":45,"value":1600},{"type":39,"tag":446,"props":1767,"children":1768},{"style":464},[1769],{"type":45,"value":520},{"type":39,"tag":446,"props":1771,"children":1772},{"style":464},[1773],{"type":45,"value":1609},{"type":39,"tag":446,"props":1775,"children":1776},{"style":453},[1777],{"type":45,"value":1614},{"type":39,"tag":446,"props":1779,"children":1780},{"style":458},[1781],{"type":45,"value":461},{"type":39,"tag":446,"props":1783,"children":1784},{"style":458},[1785],{"type":45,"value":1623},{"type":39,"tag":446,"props":1787,"children":1788},{"style":458},[1789],{"type":45,"value":1790}," -m",{"type":39,"tag":446,"props":1792,"children":1793},{"style":458},[1794],{"type":45,"value":1795}," http.server",{"type":39,"tag":446,"props":1797,"children":1798},{"style":464},[1799],{"type":45,"value":1633},{"type":39,"tag":446,"props":1801,"children":1802},{"style":475},[1803],{"type":45,"value":1804},"$PORT",{"type":39,"tag":446,"props":1806,"children":1807},{"style":464},[1808],{"type":45,"value":520},{"type":39,"tag":446,"props":1810,"children":1811},{"style":458},[1812],{"type":45,"value":1813}," --bind",{"type":39,"tag":446,"props":1815,"children":1817},{"style":1816},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1818],{"type":45,"value":1819}," 0.0.0.0",{"type":39,"tag":446,"props":1821,"children":1822},{"style":458},[1823],{"type":45,"value":1824}," --directory",{"type":39,"tag":446,"props":1826,"children":1827},{"style":464},[1828],{"type":45,"value":1829}," \"$(",{"type":39,"tag":446,"props":1831,"children":1832},{"style":453},[1833],{"type":45,"value":1834},"dirname",{"type":39,"tag":446,"props":1836,"children":1837},{"style":464},[1838],{"type":45,"value":1633},{"type":39,"tag":446,"props":1840,"children":1841},{"style":475},[1842],{"type":45,"value":1673},{"type":39,"tag":446,"props":1844,"children":1845},{"style":464},[1846],{"type":45,"value":1847},"\")\"\n",{"type":39,"tag":48,"props":1849,"children":1850},{},[1851],{"type":45,"value":1852},"For Windows (PowerShell):",{"type":39,"tag":435,"props":1854,"children":1858},{"className":1855,"code":1856,"language":1857,"meta":440,"style":440},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Pick an unused port and start the server as a persistent process\n$HTML_FILE = \"C:\\tmp\\dashboard.html\"   # ← set to the actual HTML file path\n$PORT = & \"$HOME\\.local\\bin\\uv\" run python -c \"import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()\"\n$FILENAME = Split-Path $HTML_FILE -Leaf\n$DIRNAME = Split-Path $HTML_FILE -Parent\nWrite-Host \"View URL: http:\u002F\u002Flocalhost:${PORT}\u002F${FILENAME}\"\n& \"$HOME\\.local\\bin\\uv\" run python -m http.server $PORT --bind 0.0.0.0 --directory $DIRNAME\n","powershell",[1859],{"type":39,"tag":116,"props":1860,"children":1861},{"__ignoreMap":440},[1862,1869,1877,1885,1893,1901,1909],{"type":39,"tag":446,"props":1863,"children":1864},{"class":448,"line":449},[1865],{"type":39,"tag":446,"props":1866,"children":1867},{},[1868],{"type":45,"value":1531},{"type":39,"tag":446,"props":1870,"children":1871},{"class":448,"line":496},[1872],{"type":39,"tag":446,"props":1873,"children":1874},{},[1875],{"type":45,"value":1876},"$HTML_FILE = \"C:\\tmp\\dashboard.html\"   # ← set to the actual HTML file path\n",{"type":39,"tag":446,"props":1878,"children":1879},{"class":448,"line":509},[1880],{"type":39,"tag":446,"props":1881,"children":1882},{},[1883],{"type":45,"value":1884},"$PORT = & \"$HOME\\.local\\bin\\uv\" run python -c \"import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()\"\n",{"type":39,"tag":446,"props":1886,"children":1887},{"class":448,"line":604},[1888],{"type":39,"tag":446,"props":1889,"children":1890},{},[1891],{"type":45,"value":1892},"$FILENAME = Split-Path $HTML_FILE -Leaf\n",{"type":39,"tag":446,"props":1894,"children":1895},{"class":448,"line":1110},[1896],{"type":39,"tag":446,"props":1897,"children":1898},{},[1899],{"type":45,"value":1900},"$DIRNAME = Split-Path $HTML_FILE -Parent\n",{"type":39,"tag":446,"props":1902,"children":1903},{"class":448,"line":1128},[1904],{"type":39,"tag":446,"props":1905,"children":1906},{},[1907],{"type":45,"value":1908},"Write-Host \"View URL: http:\u002F\u002Flocalhost:${PORT}\u002F${FILENAME}\"\n",{"type":39,"tag":446,"props":1910,"children":1911},{"class":448,"line":1137},[1912],{"type":39,"tag":446,"props":1913,"children":1914},{},[1915],{"type":45,"value":1916},"& \"$HOME\\.local\\bin\\uv\" run python -m http.server $PORT --bind 0.0.0.0 --directory $DIRNAME\n",{"type":39,"tag":48,"props":1918,"children":1919},{},[1920,1922,1928,1930,1936,1938,1944,1946,1950,1952,1958],{"type":45,"value":1921},"Then provide ",{"type":39,"tag":116,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":45,"value":1927},"http:\u002F\u002Flocalhost:\u003Cport>\u002F\u003Cfilename>",{"type":45,"value":1929}," (or\n",{"type":39,"tag":116,"props":1931,"children":1933},{"className":1932},[],[1934],{"type":45,"value":1935},"http:\u002F\u002F127.0.0.1:\u003Cport>\u002F\u003Cfilename>",{"type":45,"value":1937},") as the primary clickable link in your\nresponse. Additionally, provide ",{"type":39,"tag":116,"props":1939,"children":1941},{"className":1940},[],[1942],{"type":45,"value":1943},"http:\u002F\u002F\u003Chostname>:\u003Cport>\u002F\u003Cfilename>",{"type":45,"value":1945}," as a\nfallback link for remote setups. Do ",{"type":39,"tag":62,"props":1947,"children":1948},{},[1949],{"type":45,"value":349},{"type":45,"value":1951}," give the user a raw ",{"type":39,"tag":116,"props":1953,"children":1955},{"className":1954},[],[1956],{"type":45,"value":1957},"file:\u002F\u002F",{"type":45,"value":1959}," path.",{"type":39,"tag":612,"props":1961,"children":1963},{"id":1962},"flags",[1964],{"type":45,"value":1965},"Flags",{"type":39,"tag":165,"props":1967,"children":1968},{},[1969,1990,2003,2029,2050,2063,2088,2101,2115,2145,2166,2186,2200,2227,2241],{"type":39,"tag":58,"props":1970,"children":1971},{},[1972,1981,1983,1989],{"type":39,"tag":62,"props":1973,"children":1974},{},[1975],{"type":39,"tag":116,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":45,"value":1980},"--input",{"type":45,"value":1982},": Text string (mutually exclusive with ",{"type":39,"tag":116,"props":1984,"children":1986},{"className":1985},[],[1987],{"type":45,"value":1988},"--input_file",{"type":45,"value":670},{"type":39,"tag":58,"props":1991,"children":1992},{},[1993,2001],{"type":39,"tag":62,"props":1994,"children":1995},{},[1996],{"type":39,"tag":116,"props":1997,"children":1999},{"className":1998},[],[2000],{"type":45,"value":1988},{"type":45,"value":2002},": Path to UTF-8 text file",{"type":39,"tag":58,"props":2004,"children":2005},{},[2006,2015,2016,2022,2023],{"type":39,"tag":62,"props":2007,"children":2008},{},[2009],{"type":39,"tag":116,"props":2010,"children":2012},{"className":2011},[],[2013],{"type":45,"value":2014},"--language",{"type":45,"value":269},{"type":39,"tag":116,"props":2017,"children":2019},{"className":2018},[],[2020],{"type":45,"value":2021},"latin",{"type":45,"value":755},{"type":39,"tag":116,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":45,"value":2028},"greek",{"type":39,"tag":58,"props":2030,"children":2031},{},[2032,2041,2043,2049],{"type":39,"tag":62,"props":2033,"children":2034},{},[2035],{"type":39,"tag":116,"props":2036,"children":2038},{"className":2037},[],[2039],{"type":45,"value":2040},"--models_dir",{"type":45,"value":2042},": Model files directory (default:\n",{"type":39,"tag":116,"props":2044,"children":2046},{"className":2045},[],[2047],{"type":45,"value":2048},"$HOME\u002F.predictingthepast\u002Fmodels",{"type":45,"value":670},{"type":39,"tag":58,"props":2051,"children":2052},{},[2053,2061],{"type":39,"tag":62,"props":2054,"children":2055},{},[2056],{"type":39,"tag":116,"props":2057,"children":2059},{"className":2058},[],[2060],{"type":45,"value":953},{"type":45,"value":2062},": Run geographical and chronological attribution",{"type":39,"tag":58,"props":2064,"children":2065},{},[2066,2074,2076,2081,2082,2087],{"type":39,"tag":62,"props":2067,"children":2068},{},[2069],{"type":39,"tag":116,"props":2070,"children":2072},{"className":2071},[],[2073],{"type":45,"value":967},{"type":45,"value":2075},": Run text restoration (requires ",{"type":39,"tag":116,"props":2077,"children":2079},{"className":2078},[],[2080],{"type":45,"value":237},{"type":45,"value":755},{"type":39,"tag":116,"props":2083,"children":2085},{"className":2084},[],[2086],{"type":45,"value":287},{"type":45,"value":982},{"type":39,"tag":58,"props":2089,"children":2090},{},[2091,2099],{"type":39,"tag":62,"props":2092,"children":2093},{},[2094],{"type":39,"tag":116,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":45,"value":994},{"type":45,"value":2100},": Run parallel inscription retrieval",{"type":39,"tag":58,"props":2102,"children":2103},{},[2104,2113],{"type":39,"tag":62,"props":2105,"children":2106},{},[2107],{"type":39,"tag":116,"props":2108,"children":2110},{"className":2109},[],[2111],{"type":45,"value":2112},"--contextualize_top_k",{"type":45,"value":2114},": Number of top parallels to return (default: 10)",{"type":39,"tag":58,"props":2116,"children":2117},{},[2118,2127,2129,2135,2137,2143],{"type":39,"tag":62,"props":2119,"children":2120},{},[2121],{"type":39,"tag":116,"props":2122,"children":2124},{"className":2123},[],[2125],{"type":45,"value":2126},"--contextualize_exclude_test_valid",{"type":45,"value":2128},": Exclude test\u002Fvalidation texts from\ncontextualization results. Filters on the internal numeric ",{"type":39,"tag":116,"props":2130,"children":2132},{"className":2131},[],[2133],{"type":45,"value":2134},"id",{"type":45,"value":2136}," (where ",{"type":39,"tag":116,"props":2138,"children":2140},{"className":2139},[],[2141],{"type":45,"value":2142},"id % 10",{"type":45,"value":2144}," is 3 or 4).",{"type":39,"tag":58,"props":2146,"children":2147},{},[2148,2156,2158,2164],{"type":39,"tag":62,"props":2149,"children":2150},{},[2151],{"type":39,"tag":116,"props":2152,"children":2154},{"className":2153},[],[2155],{"type":45,"value":1012},{"type":45,"value":2157},": Generate a text embedding vector (default: off). When\nset, the output includes an ",{"type":39,"tag":116,"props":2159,"children":2161},{"className":2160},[],[2162],{"type":45,"value":2163},"embedding",{"type":45,"value":2165}," field with the full-precision float\nvector.",{"type":39,"tag":58,"props":2167,"children":2168},{},[2169,2178,2180,2185],{"type":39,"tag":62,"props":2170,"children":2171},{},[2172],{"type":39,"tag":116,"props":2173,"children":2175},{"className":2174},[],[2176],{"type":45,"value":2177},"--output_json",{"type":45,"value":2179},": Save combined JSON to file (for ",{"type":39,"tag":116,"props":2181,"children":2183},{"className":2182},[],[2184],{"type":45,"value":199},{"type":45,"value":670},{"type":39,"tag":58,"props":2187,"children":2188},{},[2189,2198],{"type":39,"tag":62,"props":2190,"children":2191},{},[2192],{"type":39,"tag":116,"props":2193,"children":2195},{"className":2194},[],[2196],{"type":45,"value":2197},"--restore_beam_width",{"type":45,"value":2199},": Number of candidate restorations to explore in\nbeam search. Higher = more thorough but slower (default: 100)",{"type":39,"tag":58,"props":2201,"children":2202},{},[2203,2211,2213,2218,2220,2225],{"type":39,"tag":62,"props":2204,"children":2205},{},[2206],{"type":39,"tag":116,"props":2207,"children":2209},{"className":2208},[],[2210],{"type":45,"value":792},{"type":45,"value":2212},": Maximum total characters to restore across all ",{"type":39,"tag":116,"props":2214,"children":2216},{"className":2215},[],[2217],{"type":45,"value":237},{"type":45,"value":2219},"\nand ",{"type":39,"tag":116,"props":2221,"children":2223},{"className":2222},[],[2224],{"type":45,"value":287},{"type":45,"value":2226}," gaps (default: 15)",{"type":39,"tag":58,"props":2228,"children":2229},{},[2230,2239],{"type":39,"tag":62,"props":2231,"children":2232},{},[2233],{"type":39,"tag":116,"props":2234,"children":2236},{"className":2235},[],[2237],{"type":45,"value":2238},"--restore_temperature",{"type":45,"value":2240},": Sampling temperature. Lower = conservative,\nhigher = creative (default: 1.0)",{"type":39,"tag":58,"props":2242,"children":2243},{},[2244,2253],{"type":39,"tag":62,"props":2245,"children":2246},{},[2247],{"type":39,"tag":116,"props":2248,"children":2250},{"className":2249},[],[2251],{"type":45,"value":2252},"--window_overlap",{"type":45,"value":2254},": Overlap fraction for long-text windowing (default:\n0.33)",{"type":39,"tag":612,"props":2256,"children":2258},{"id":2257},"long-texts-750-characters",[2259],{"type":45,"value":2260},"Long Texts (>750 characters)",{"type":39,"tag":48,"props":2262,"children":2263},{},[2264,2266,2271,2273,2278],{"type":45,"value":2265},"Each window must be between ",{"type":39,"tag":62,"props":2267,"children":2268},{},[2269],{"type":45,"value":2270},"25 and 750 characters",{"type":45,"value":2272},". If the input text exceeds\n750 characters, it is automatically split into overlapping windows (default 33%\noverlap). Each window is run through the model independently, and the\ngeographical and chronological attribution results are ",{"type":39,"tag":62,"props":2274,"children":2275},{},[2276],{"type":45,"value":2277},"averaged",{"type":45,"value":2279}," across all\nwindows. Restoration and contextualization are run per-window and concatenated.",{"type":39,"tag":612,"props":2281,"children":2283},{"id":2282},"output-format",[2284],{"type":45,"value":2285},"Output Format",{"type":39,"tag":48,"props":2287,"children":2288},{},[2289,2291,2296,2298,2303,2305,2311],{"type":45,"value":2290},"Use ",{"type":39,"tag":116,"props":2292,"children":2294},{"className":2293},[],[2295],{"type":45,"value":2177},{"type":45,"value":2297}," to save the combined JSON to a file. For the full\n",{"type":39,"tag":116,"props":2299,"children":2301},{"className":2300},[],[2302],{"type":45,"value":2177},{"type":45,"value":2304}," format including all fields for attribution, restoration, and\ncontextualization, see ",{"type":39,"tag":149,"props":2306,"children":2308},{"href":2307},"references\u002Foutput_format.md",[2309],{"type":45,"value":2310},"output_format.md",{"type":45,"value":259},{"type":39,"tag":612,"props":2313,"children":2315},{"id":2314},"presenting-results",[2316],{"type":45,"value":2317},"Presenting Results",{"type":39,"tag":48,"props":2319,"children":2320},{},[2321,2323,2328,2330,2336],{"type":45,"value":2322},"Present results for ",{"type":39,"tag":62,"props":2324,"children":2325},{},[2326],{"type":45,"value":2327},"every",{"type":45,"value":2329}," task requested by the user. Always generate the\nHTML dashboard, serve it via the background HTTP server described above, and\nprovide the ",{"type":39,"tag":116,"props":2331,"children":2333},{"className":2332},[],[2334],{"type":45,"value":2335},"http:\u002F\u002F",{"type":45,"value":2337}," URL as a clickable link. Format years as BCE\u002FCE.",{"type":39,"tag":2339,"props":2340,"children":2342},"h4",{"id":2341},"restoration",[2343],{"type":45,"value":66},{"type":39,"tag":48,"props":2345,"children":2346},{},[2347,2352],{"type":39,"tag":62,"props":2348,"children":2349},{},[2350],{"type":45,"value":2351},"Bold",{"type":45,"value":2353}," the restored characters in the top prediction. Show top-10 beam-search\ncandidates in a numbered table (rank, restored text, score). Summarise the most\nsalient words (not characters) — do not dump the raw saliency array.",{"type":39,"tag":2339,"props":2355,"children":2357},{"id":2356},"geographical-attribution",[2358],{"type":45,"value":2359},"Geographical Attribution",{"type":39,"tag":48,"props":2361,"children":2362},{},[2363],{"type":45,"value":2364},"Show the top 10 regions in a ranked table (rank, region, score). Highlight the\ntop-1 prediction in the narrative. Summarise the most salient words (not\ncharacters) — do not dump the raw saliency array.",{"type":39,"tag":2339,"props":2366,"children":2368},{"id":2367},"chronological-attribution",[2369],{"type":45,"value":2370},"Chronological Attribution",{"type":39,"tag":48,"props":2372,"children":2373},{},[2374],{"type":45,"value":2375},"Report top year and weighted average year. Describe the distribution shape (peak\ndecade, probable range) — do not list all 160 bins. Summarise the most salient\nwords (not characters) — do not dump the raw saliency array.",{"type":39,"tag":2339,"props":2377,"children":2379},{"id":2378},"contextualization-parallels",[2380],{"type":45,"value":2381},"Contextualization (Parallels)",{"type":39,"tag":48,"props":2383,"children":2384},{},[2385,2386,2392,2394,2399],{"type":45,"value":2290},{"type":39,"tag":116,"props":2387,"children":2389},{"className":2388},[],[2390],{"type":45,"value":2391},"jp",{"type":45,"value":2393}," or write your own code to extract the contextualization data from\n",{"type":39,"tag":116,"props":2395,"children":2397},{"className":2396},[],[2398],{"type":45,"value":2177},{"type":45,"value":2400},". Show the top parallels in a table (rank, ID, Trismegistos ID,\nregion, date range, score, partner link). Quote the full text of the top\nparallels from the JSON.",{"type":39,"tag":48,"props":2402,"children":2403},{},[2404,2406,2411],{"type":45,"value":2405},"If the user requests a specific number of parallels, use ",{"type":39,"tag":116,"props":2407,"children":2409},{"className":2408},[],[2410],{"type":45,"value":2112},{"type":45,"value":2412},"\nto control how many are returned.",{"type":39,"tag":48,"props":2414,"children":2415},{},[2416,2418,2423,2425,2435,2436,2441],{"type":45,"value":2417},"If the user asks to exclude test\u002Fvalidation texts, add\n",{"type":39,"tag":116,"props":2419,"children":2421},{"className":2420},[],[2422],{"type":45,"value":2126},{"type":45,"value":2424},". This filters on the ",{"type":39,"tag":62,"props":2426,"children":2427},{},[2428,2430],{"type":45,"value":2429},"internal numeric\n",{"type":39,"tag":116,"props":2431,"children":2433},{"className":2432},[],[2434],{"type":45,"value":2134},{"type":45,"value":2136},{"type":39,"tag":116,"props":2437,"children":2439},{"className":2438},[],[2440],{"type":45,"value":2142},{"type":45,"value":2442}," is 3 for test or 4 for validation).",{"type":39,"tag":2339,"props":2444,"children":2446},{"id":2445},"embedding-when-embedding-is-set",[2447,2449,2454],{"type":45,"value":2448},"Embedding (when ",{"type":39,"tag":116,"props":2450,"children":2452},{"className":2451},[],[2453],{"type":45,"value":1012},{"type":45,"value":2455}," is set)",{"type":39,"tag":48,"props":2457,"children":2458},{},[2459],{"type":45,"value":2460},"State the vector dimensionality (384 floats).",{"type":39,"tag":100,"props":2462,"children":2464},{"id":2463},"references",[2465],{"type":45,"value":2466},"References",{"type":39,"tag":48,"props":2468,"children":2469},{},[2470,2472],{"type":45,"value":2471},"For more information, see:\n",{"type":39,"tag":149,"props":2473,"children":2476},{"href":2474,"rel":2475},"https:\u002F\u002Fpredictingthepast.com",[153],[2477],{"type":45,"value":2478},"predictingthepast.com",{"type":39,"tag":48,"props":2480,"children":2481},{},[2482,2487],{"type":39,"tag":62,"props":2483,"children":2484},{},[2485],{"type":45,"value":2486},"IMPORTANT:",{"type":45,"value":2488}," The first time you return inference results to the user, remind\nthem to cite the appropriate paper below (Ithaca for Greek, Aeneas for Latin),\nand the dataset acknowledgements below.",{"type":39,"tag":48,"props":2490,"children":2491},{},[2492,2497,2499,2504],{"type":39,"tag":62,"props":2493,"children":2494},{},[2495],{"type":45,"value":2496},"Ithaca",{"type":45,"value":2498}," (Ancient Greek): > Assael, Y., Sommerschield, T., Shillingford, B. et\nal. Restoring and attributing ancient texts using deep neural networks. ",{"type":39,"tag":868,"props":2500,"children":2501},{},[2502],{"type":45,"value":2503},"Nature",{"type":45,"value":2505},"\n603, 280–283 (2022).",{"type":39,"tag":48,"props":2507,"children":2508},{},[2509,2514,2516,2520],{"type":39,"tag":62,"props":2510,"children":2511},{},[2512],{"type":45,"value":2513},"Aeneas",{"type":45,"value":2515}," (Latin): > Assael, Y., Sommerschield, T., Cooley, A. et al.\nContextualizing ancient texts with generative neural networks. ",{"type":39,"tag":868,"props":2517,"children":2518},{},[2519],{"type":45,"value":2503},{"type":45,"value":2521}," 645,\n141–147 (2025).",{"type":39,"tag":612,"props":2523,"children":2525},{"id":2524},"dataset-acknowledgements",[2526],{"type":45,"value":2527},"Dataset Acknowledgements",{"type":39,"tag":48,"props":2529,"children":2530},{},[2531,2535],{"type":39,"tag":62,"props":2532,"children":2533},{},[2534],{"type":45,"value":2486},{"type":45,"value":2536}," The first time you present inference results to the user, include\nthe appropriate citation and the full dataset acknowledgement for the language\nused (see below).",{"type":39,"tag":48,"props":2538,"children":2539},{},[2540],{"type":45,"value":2541},"The Ithaca and Aeneas projects rely on the availability of high-quality datasets\nof ancient Greek and Latin inscriptions, respectively. These datasets were built\nthrough centuries of scholarly collection and decades of digital editorial work.",{"type":39,"tag":48,"props":2543,"children":2544},{},[2545,2549,2551,2558],{"type":39,"tag":62,"props":2546,"children":2547},{},[2548],{"type":45,"value":2496},{"type":45,"value":2550}," (Ancient Greek): In particular, Ithaca draws on a 2019 version of the\nSearchable Greek Inscriptions database made available under \"Fair Use\" license\nby the Packard Humanities Institute, generously supported by David Packard:\n",{"type":39,"tag":149,"props":2552,"children":2555},{"href":2553,"rel":2554},"https:\u002F\u002Finscriptions.packhum.org",[153],[2556],{"type":45,"value":2557},"inscriptions.packhum.org",{"type":45,"value":259},{"type":39,"tag":48,"props":2560,"children":2561},{},[2562,2566],{"type":39,"tag":62,"props":2563,"children":2564},{},[2565],{"type":45,"value":2513},{"type":45,"value":2567}," (Latin): Aeneas was trained on data from:",{"type":39,"tag":165,"props":2569,"children":2570},{},[2571,2598,2624],{"type":39,"tag":58,"props":2572,"children":2573},{},[2574,2579,2581,2588,2590,2597],{"type":39,"tag":62,"props":2575,"children":2576},{},[2577],{"type":45,"value":2578},"Epigraphic Database Roma (EDR)",{"type":45,"value":2580},": Made available pursuant to a Creative\nCommons Attribution 4.0 International License (CC-BY) on\n",{"type":39,"tag":149,"props":2582,"children":2585},{"href":2583,"rel":2584},"https:\u002F\u002Fzenodo.org\u002Frecords\u002F3575495",[153],[2586],{"type":45,"value":2587},"Zenodo",{"type":45,"value":2589},". EDR is also available at\n",{"type":39,"tag":149,"props":2591,"children":2594},{"href":2592,"rel":2593},"http:\u002F\u002Fwww.edr-edr.it\u002F",[153],[2595],{"type":45,"value":2596},"edr-edr.it",{"type":45,"value":259},{"type":39,"tag":58,"props":2599,"children":2600},{},[2601,2606,2608,2614,2616,2623],{"type":39,"tag":62,"props":2602,"children":2603},{},[2604],{"type":45,"value":2605},"Epigraphic Database Heidelberg (EDH)",{"type":45,"value":2607},": Made available pursuant to a\nCreative Commons Attribution-ShareAlike 4.0 International License (CC-BY-SA)\non ",{"type":39,"tag":149,"props":2609,"children":2612},{"href":2610,"rel":2611},"https:\u002F\u002Fzenodo.org\u002Frecords\u002F3575155",[153],[2613],{"type":45,"value":2587},{"type":45,"value":2615},". EDH is also available at\n",{"type":39,"tag":149,"props":2617,"children":2620},{"href":2618,"rel":2619},"https:\u002F\u002Fedh.ub.uni-heidelberg.de\u002F",[153],[2621],{"type":45,"value":2622},"edh.ub.uni-heidelberg.de",{"type":45,"value":259},{"type":39,"tag":58,"props":2625,"children":2626},{},[2627,2632,2634,2640,2642,2649,2651,2658],{"type":39,"tag":62,"props":2628,"children":2629},{},[2630],{"type":45,"value":2631},"ETL repository for Epigraphic Database Clauss Slaby (EDCS_ETL)",{"type":45,"value":2633},": Made\navailable pursuant to a Creative Commons Attribution 4.0 International\nLicense (CC-BY) on ",{"type":39,"tag":149,"props":2635,"children":2638},{"href":2636,"rel":2637},"https:\u002F\u002Fzenodo.org\u002Frecords\u002F7072337",[153],[2639],{"type":45,"value":2587},{"type":45,"value":2641},". EDCS_ETL\nis also available at ",{"type":39,"tag":149,"props":2643,"children":2646},{"href":2644,"rel":2645},"http:\u002F\u002Fwww.manfredclauss.de\u002F",[153],[2647],{"type":45,"value":2648},"manfredclauss.de",{"type":45,"value":2650}," and\n",{"type":39,"tag":149,"props":2652,"children":2655},{"href":2653,"rel":2654},"https:\u002F\u002Fgithub.com\u002Fsdam-au\u002FEDCS_ETL",[153],[2656],{"type":45,"value":2657},"github.com\u002Fsdam-au\u002FEDCS_ETL",{"type":45,"value":259},{"type":39,"tag":48,"props":2660,"children":2661},{},[2662],{"type":45,"value":2663},"These resources bring together a large proportion of published inscriptions in a\nsearchable digital format.",{"type":39,"tag":2665,"props":2666,"children":2667},"style",{},[2668],{"type":45,"value":2669},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2671,"total":2780},[2672,2689,2704,2724,2736,2751,2767],{"slug":2673,"name":2673,"fn":2674,"description":2675,"org":2676,"tags":2677,"stars":22,"repoUrl":23,"updatedAt":2688},"alphafold-database-fetch-and-analyze","retrieve and analyze AlphaFold protein structures","Retrieve and analyze AlphaFold predicted structures for a protein. Use when the user provides a specific UniProt Accession ID and wants structural confidence metrics (pLDDT), domain boundary analysis, or disorder assessment. Do not use if the user only has a protein name, gene name, or amino acid sequence — ask for a UniProt ID first.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2678,2681,2684,2687],{"name":2679,"slug":2680,"type":15},"Bioinformatics","bioinformatics",{"name":2682,"slug":2683,"type":15},"Genomics","genomics",{"name":2685,"slug":2686,"type":15},"Life Sciences","life-sciences",{"name":13,"slug":14,"type":15},"2026-07-12T07:51:51.827211",{"slug":2690,"name":2690,"fn":2691,"description":2692,"org":2693,"tags":2694,"stars":22,"repoUrl":23,"updatedAt":2703},"alphagenome-single-variant-analysis","analyze genetic variant effects with AlphaGenome","Analyzes genetic variant effects on gene expression (RNA-seq), chromatin accessibility (DNASE), histone marks (ChIP), and transcription factors using the AlphaGenome API. Use when the user asks about non-coding variant effects, pathogenicity, clinical significance, disease associations, functional effects, gene expression changes, splicing disruption, or regulatory effects in promoters and enhancers. Also use for resolving biological terms to tissue\u002Fcell-type ontologies (UBERON\u002FCL) or analyzing variants in chr:pos:ref>alt format.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2695,2696,2699,2700],{"name":2679,"slug":2680,"type":15},{"name":2697,"slug":2698,"type":15},"Genetics","genetics",{"name":13,"slug":14,"type":15},{"name":2701,"slug":2702,"type":15},"RNA-seq","rna-seq","2026-07-12T07:51:39.494803",{"slug":2705,"name":2705,"fn":2706,"description":2707,"org":2708,"tags":2709,"stars":22,"repoUrl":23,"updatedAt":2723},"chembl-database","query ChEMBL database for bioactive molecules","Query the ChEMBL database for bioactive molecules, drug targets, bioactivity data, approved drugs, and chemical structures. Use when the user asks about compounds, targets, IC50\u002FKi values, drug mechanisms, or structure searches.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2710,2713,2716,2719,2722],{"name":2711,"slug":2712,"type":15},"ChEMBL","chembl",{"name":2714,"slug":2715,"type":15},"Chemistry","chemistry",{"name":2717,"slug":2718,"type":15},"Database","database",{"name":2720,"slug":2721,"type":15},"Pharmacology","pharmacology",{"name":13,"slug":14,"type":15},"2026-07-12T07:51:35.544306",{"slug":2725,"name":2725,"fn":2726,"description":2727,"org":2728,"tags":2729,"stars":22,"repoUrl":23,"updatedAt":2735},"clinical-trials-database","query clinical trial data","Query ClinicalTrials.gov via APIv2. Use when you want to search for trials by condition, drug, location, status, or phase; retrieve trial details by NCT ID; check eligibility\u002Finclusion criteria; count trials across conditions or time periods; identify a sponsor's trial portfolio; find recruiting trials for patient matching.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2730,2733,2734],{"name":2731,"slug":2732,"type":15},"Clinical Trials","clinical-trials",{"name":2685,"slug":2686,"type":15},{"name":13,"slug":14,"type":15},"2026-07-12T07:52:06.846705",{"slug":2737,"name":2737,"fn":2738,"description":2739,"org":2740,"tags":2741,"stars":22,"repoUrl":23,"updatedAt":2750},"clinvar-database","retrieve clinical significance from ClinVar database","Use when needing clinical significance, pathogenicity classifications (e.g., Pathogenic, Benign, VUS), clinical evidence rationales, or finding \"hard positive\" benchmark controls for human genomic variants.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2742,2745,2746,2749],{"name":2743,"slug":2744,"type":15},"ClinVar","clinvar",{"name":2697,"slug":2698,"type":15},{"name":2747,"slug":2748,"type":15},"Healthcare","healthcare",{"name":13,"slug":14,"type":15},"2026-07-12T07:51:36.86094",{"slug":2752,"name":2752,"fn":2753,"description":2754,"org":2755,"tags":2756,"stars":22,"repoUrl":23,"updatedAt":2766},"credentials","manage and verify API credentials safely","Instructions for handling API keys and credentials safely, verifying their presence, and prompting the user to add them if missing using a safe protocol.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2757,2760,2763],{"name":2758,"slug":2759,"type":15},"Compliance","compliance",{"name":2761,"slug":2762,"type":15},"Operations","operations",{"name":2764,"slug":2765,"type":15},"Security","security","2026-07-12T07:52:17.355491",{"slug":2768,"name":2768,"fn":2769,"description":2770,"org":2771,"tags":2772,"stars":22,"repoUrl":23,"updatedAt":2779},"dbsnp-database","search genetic variants in dbSNP database","Use when you want to look up, map, and search for short genetic variants (SNPs, indels) in NCBI's dbSNP database. Resolves between rsIDs, genomic coordinates in VCF format, and HGVS strings. For an rsID, returns variant type, gene associations, clinical significance, allele frequencies, and genomic coordinates (GRCh38).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2773,2774,2775,2778],{"name":2679,"slug":2680,"type":15},{"name":2697,"slug":2698,"type":15},{"name":2776,"slug":2777,"type":15},"NCBI","ncbi",{"name":13,"slug":14,"type":15},"2026-07-12T07:51:33.054229",38,{"items":2782,"total":2780},[2783,2790,2797,2805,2811,2818,2824,2831,2843,2858,2869,2879],{"slug":2673,"name":2673,"fn":2674,"description":2675,"org":2784,"tags":2785,"stars":22,"repoUrl":23,"updatedAt":2688},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2786,2787,2788,2789],{"name":2679,"slug":2680,"type":15},{"name":2682,"slug":2683,"type":15},{"name":2685,"slug":2686,"type":15},{"name":13,"slug":14,"type":15},{"slug":2690,"name":2690,"fn":2691,"description":2692,"org":2791,"tags":2792,"stars":22,"repoUrl":23,"updatedAt":2703},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2793,2794,2795,2796],{"name":2679,"slug":2680,"type":15},{"name":2697,"slug":2698,"type":15},{"name":13,"slug":14,"type":15},{"name":2701,"slug":2702,"type":15},{"slug":2705,"name":2705,"fn":2706,"description":2707,"org":2798,"tags":2799,"stars":22,"repoUrl":23,"updatedAt":2723},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2800,2801,2802,2803,2804],{"name":2711,"slug":2712,"type":15},{"name":2714,"slug":2715,"type":15},{"name":2717,"slug":2718,"type":15},{"name":2720,"slug":2721,"type":15},{"name":13,"slug":14,"type":15},{"slug":2725,"name":2725,"fn":2726,"description":2727,"org":2806,"tags":2807,"stars":22,"repoUrl":23,"updatedAt":2735},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2808,2809,2810],{"name":2731,"slug":2732,"type":15},{"name":2685,"slug":2686,"type":15},{"name":13,"slug":14,"type":15},{"slug":2737,"name":2737,"fn":2738,"description":2739,"org":2812,"tags":2813,"stars":22,"repoUrl":23,"updatedAt":2750},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2814,2815,2816,2817],{"name":2743,"slug":2744,"type":15},{"name":2697,"slug":2698,"type":15},{"name":2747,"slug":2748,"type":15},{"name":13,"slug":14,"type":15},{"slug":2752,"name":2752,"fn":2753,"description":2754,"org":2819,"tags":2820,"stars":22,"repoUrl":23,"updatedAt":2766},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2821,2822,2823],{"name":2758,"slug":2759,"type":15},{"name":2761,"slug":2762,"type":15},{"name":2764,"slug":2765,"type":15},{"slug":2768,"name":2768,"fn":2769,"description":2770,"org":2825,"tags":2826,"stars":22,"repoUrl":23,"updatedAt":2779},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2827,2828,2829,2830],{"name":2679,"slug":2680,"type":15},{"name":2697,"slug":2698,"type":15},{"name":2776,"slug":2777,"type":15},{"name":13,"slug":14,"type":15},{"slug":2832,"name":2832,"fn":2833,"description":2834,"org":2835,"tags":2836,"stars":22,"repoUrl":23,"updatedAt":2842},"embl-ebi-ols","search biomedical ontologies in EMBL-EBI OLS","Query and search the EMBL-EBI Ontology Lookup Service (OLS) for biomedical ontology terms, definitions, and hierarchies across 250+ ontologies (e.g., GO, DOID, HP). Use when the user asks to search for terms, retrieve details, navigate hierarchies (parents, children, ancestors), look up properties and individuals, get autocomplete suggestions, or access ontology metadata and statistics.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2837,2838,2841],{"name":2679,"slug":2680,"type":15},{"name":2839,"slug":2840,"type":15},"Ontology","ontology",{"name":13,"slug":14,"type":15},"2026-07-12T07:51:59.368324",{"slug":2844,"name":2844,"fn":2845,"description":2846,"org":2847,"tags":2848,"stars":22,"repoUrl":23,"updatedAt":2857},"encode-ccres-database","query ENCODE regulatory and experimental data","Query the ENCODE Registry of cis-Regulatory Elements (cCREs) via the SCREEN GraphQL API, or make custom queries to the ENCODE Portal REST API for experiments and files (ChIP-seq peaks, etc.). Use when you want to query regulatory annotations or raw experimental data across human cell types.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2849,2850,2853,2854],{"name":2679,"slug":2680,"type":15},{"name":2851,"slug":2852,"type":15},"GraphQL","graphql",{"name":13,"slug":14,"type":15},{"name":2855,"slug":2856,"type":15},"REST API","rest-api","2026-07-12T07:52:10.597139",{"slug":2859,"name":2859,"fn":2860,"description":2861,"org":2862,"tags":2863,"stars":22,"repoUrl":23,"updatedAt":2868},"ensembl-database","query genomic and protein data from Ensembl","Query the Ensembl database to resolve gene, transcript, and protein IDs, fetch genomic or protein sequences, retrieve gene structures (exons), and get variant consequence and effect predictions (VEP). Use this skill as a primary ID translator, genomic sequence database and variant effect prediction tool.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2864,2865,2866,2867],{"name":2679,"slug":2680,"type":15},{"name":2697,"slug":2698,"type":15},{"name":2685,"slug":2686,"type":15},{"name":13,"slug":14,"type":15},"2026-07-12T07:51:41.645835",{"slug":2870,"name":2870,"fn":2871,"description":2872,"org":2873,"tags":2874,"stars":22,"repoUrl":23,"updatedAt":2878},"foldseek-structural-search","perform 3D protein structural searches","Performs 3D structural searches of proteins against various databases (PDB, AlphaFold, CATH, MGnify, etc.) using the Foldseek API. Use ONLY when the user provides a physical 3D coordinate file (.cif, .mmcif, or .pdb) and wants to find structurally similar proteins. Do NOT use if the user only provides a protein sequence, gene name, or UniProt ID.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2875,2876,2877],{"name":2679,"slug":2680,"type":15},{"name":2685,"slug":2686,"type":15},{"name":13,"slug":14,"type":15},"2026-07-12T07:52:09.354992",{"slug":2880,"name":2880,"fn":2881,"description":2882,"org":2883,"tags":2884,"stars":22,"repoUrl":23,"updatedAt":2889},"gnomad-database","query genetic variant data from gnomAD","Query the Genome Aggregation Database (gnomAD). Use when determining the rarity or allele frequency of specific genetic variants, retrieving gene constraint metrics (pLI, LOEUF) to assess loss-of-function intolerance, finding variants in a genomic region or gene, or querying structural variants. Don't use for analyzing individual patient genomes, tracking somatic mutations in cancer (use COSMIC), or requesting raw sequencing reads (use ENA).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2885,2886,2887,2888],{"name":2679,"slug":2680,"type":15},{"name":2697,"slug":2698,"type":15},{"name":2685,"slug":2686,"type":15},{"name":13,"slug":14,"type":15},"2026-07-12T07:51:38.213009"]