[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-nvidia-tao-mine-aoi-images":3,"mdc--21fqx8-key":30,"related-org-nvidia-tao-mine-aoi-images":2103,"related-repo-nvidia-tao-mine-aoi-images":2264},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":19,"repoUrl":20,"updatedAt":21,"license":22,"forks":23,"topics":24,"repo":25,"sourceUrl":28,"mdContent":29},"tao-mine-aoi-images","mine AOI images for augmentation","Runs the DEFT embed-then-mine workflow for VCN AOI iterations — embeds the gap-analysis target parquet, embeds a source pool, and mines nearest-neighbour source images for downstream augmentation. Use as the immediate next step after `tao-route-visual-changenet-samples` when expanding a real-image augmentation queue from the mining subset.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},"nvidia","NVIDIA","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnvidia.png",[12,16],{"name":13,"slug":14,"type":15},"Data Analysis","data-analysis","tag",{"name":17,"slug":18,"type":15},"Imaging","imaging",2473,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills","2026-07-14T05:29:14.261245","Apache-2.0",281,[],{"repoUrl":20,"stars":19,"forks":23,"topics":26,"description":27},[],"AI agent skills published by NVIDIA","https:\u002F\u002Fgithub.com\u002FNVIDIA\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Ftao-mine-aoi-images","---\nname: tao-mine-aoi-images\ndescription: Runs the DEFT embed-then-mine workflow for VCN AOI iterations — embeds the gap-analysis target parquet, embeds a source pool, and mines nearest-neighbour source images for downstream augmentation. Use as the immediate next step after `tao-route-visual-changenet-samples` when expanding a real-image augmentation queue from the mining subset.\nlicense: Apache-2.0\ncompatibility: Requires docker + nvidia-container-toolkit and a CUDA GPU. Pulls the `tao_toolkit.data_services` image declared in `versions.yaml` at the skill bank root.\nmetadata:\n  author: NVIDIA Corporation\n  version: \"0.1.0\"\nallowed-tools: Read Bash\ntags:\n- data\n- mining\n- embedding\n- vcn\n- aoi\n- sda\n---\n\n# DEFT Mining and Embedding Skill\n\nYou are the operator of the DEFT embed-then-mine workflow for VCN AOI. Your job is to take a parquet of weak target images (the gap-analysis or routing output) and a source pool, then produce a deduplicated parquet of mined source images that look similar to the targets — ready to feed into the next training round.\n\nThe workflow is fixed and deterministic: **embed the targets, embed the source pool, then mine nearest neighbours.** Each step's output parquet is the next step's input. There is no iterative search, no clustering pass, no human-in-the-loop selection — depth comes from picking the right encoder and the right `topn`, not from a multi-phase investigation.\n\nThe whole skill is a thin wrapper around three direct `docker run` invocations against the `tao_toolkit.data_services` image declared in `versions.yaml` (resolved at runtime — see Setup). The container's entrypoint takes `\u003Ccategory> \u003Caction> -e \u003Cspec.yaml> [hydra overrides...]` — pass `embedding image_embeddings -e \u003Cembedding_spec.yaml> …` for embedding and `tmm nearest_neighbors -e \u003Cmining_spec.yaml> …` for mining. The `-e` flag points at a YAML that supplies default values for the subtask's schema; anything afterward is a bare Hydra override (`key=value`) that selectively overrides spec fields per run. (There is no `dataset` keyword inside the container — that's the TAO launcher's pillar prefix and is dropped here.) Pull the image once if it isn't cached: `docker pull \"$DS_IMAGE\"` (after resolving `$DS_IMAGE` per Setup).\n\nSchema keys can rename between data-services releases (the RCA skill saw `inference_csv` → `inference_results_dir`, `output_dir` → `results_dir`). When in doubt, introspect the actual schema once per image: `docker run --rm \"$DS_IMAGE\" embedding image_embeddings --cfg=job` and `... tmm nearest_neighbors --cfg=job`.\n\n---\n\n## Inputs\n\n1. **Target parquet** — the gap-analysis output, typically `mining_gaps.parquet` from `tao-route-visual-changenet-samples` (or `gaps.parquet` from `tao-analyze-gaps-visual-changenet` if routing was skipped). Required column: `filepath`. If `label` is also present, label-aware filtering during mining is available; otherwise the mining task silently no-ops the filter.\n2. **Source pool** — a parquet of candidate images to mine against, with a `filepath` column. If the user only has a CSV, convert it to a parquet **with the same columns** before Step 2. For label-aware filtering, the pool must also carry a `label` column.\n3. **Embedding spec file** — a YAML containing `model`, `model_path`, `batch_size`, and (only when `model_path` is a TAO `.pth`\u002F`.ckpt`) `model_config_path`. Reused across Steps 1 and 2; `input_parquet`\u002F`output_parquet` are supplied per run as Hydra overrides. The **same** spec MUST drive both embedding steps — embeddings from different encoders are not comparable, and mismatched encoders are the most common cause of \"the mined images look unrelated\" reports.\n4. **Mining spec file** — a YAML containing `topn`, `knn_metric`, `filter_by_label`, and (rarely changed) `source_embed_column_name`\u002F`target_embed_column_name`. `source_parquet`\u002F`target_parquet`\u002F`output_parquet` are Hydra overrides at run time. SigLIP and CLIP embeddings should use `knn_metric: cosine`. When `filter_by_label: true` but either embedding parquet lacks a `label` column, the container logs a warning and proceeds **without** filtering.\n\n---\n\n## Setup\n\nResolve the concrete `tao_toolkit.data_services` URI from `versions.yaml` once at the top of the run, then confirm Docker, the NVIDIA container toolkit, and a GPU are present before doing anything else. A GPU is required for both the encoder forward pass and the cuML\u002FcuDF k-NN search; both steps fail without CUDA.\n\n```bash\n# Resolve tao_toolkit.data_services → concrete nvcr.io\u002F... URI from versions.yaml\nDS_IMAGE=$(python3 -c \"import yaml,os; print(yaml.safe_load(open(os.environ['TAO_SKILL_BANK_PATH']+'\u002Fversions.yaml'))['images']['tao_toolkit']['data_services'])\")\necho \"DS_IMAGE=$DS_IMAGE\"\n\ndocker info > \u002Fdev\u002Fnull && echo \"OK: docker\"\nnvidia-smi > \u002Fdev\u002Fnull && echo \"OK: GPU\"\ndocker image inspect \"$DS_IMAGE\" > \u002Fdev\u002Fnull \\\n  || docker pull \"$DS_IMAGE\"\n```\n\nEvery host path the container reads or writes must be bind-mounted. The most predictable approach mounts the workspace root with **identical paths** inside and outside the container, then reuses one `$DOCKER` alias for the three invocations:\n\n```bash\nWORKSPACE=\u003Cabsolute path that contains all parquets, outputs, and the source-pool images>\nDOCKER=\"docker run --gpus all --rm --ipc=host -v $WORKSPACE:$WORKSPACE -w $WORKSPACE $DS_IMAGE\"\n```\n\nDo **not** pass `--user $(id -u):$(id -g)` — it triggers a `getpwuid()` `KeyError` during the `transformers` import before any work starts. The container runs as root; chown outputs back to the host UID afterward.\n\nAuthor the two spec files once per iteration, placing them under `$WORKSPACE` so the `-e` argument resolves on both sides of the mount; per-run values stay out of the spec and are passed as Hydra overrides. If the source pool is a CSV, convert it to parquet up front (preserving `filepath`, and `label` if present). The default `embedding_spec.yaml` uses `model: SigLIP`, `model_path: google\u002Fsiglip-base-patch16-224`, `batch_size: 64`; the default `mining_spec.yaml` uses `topn: 5`, `knn_metric: cosine`, `filter_by_label: \"false\"` (quoted — the schema reads it as a string).\n\nSee `references\u002Fsetup.md` for the full environment notes, `TAO_SKILL_BANK_PATH` handling, the path-mounting rationale, the `getpwuid` chown workaround, the CSV-to-parquet snippet, and the verbatim spec-file authoring blocks.\n\n---\n\n## Method\n\nThree commands, in order. Each command's output parquet is the next command's input. Run them as plain Bash; the `$DOCKER` alias from Setup handles the container, GPU, and mounts. Every invocation follows the same shape: `-e \u003Cspec>` for the baked-in defaults, then a handful of Hydra overrides for the run-specific paths.\n\n### Step 1 — Embed the target images\n\n```bash\n$DOCKER embedding image_embeddings \\\n    -e \u003Cembedding_spec.yaml> \\\n    input_parquet=\u003Ctarget_parquet> \\\n    output_parquet=\u003Ctarget_embeddings_parquet>\n```\n\nReads the gap-analysis \u002F routing output and writes a parquet with `filepath`, `embedding`, and any extra metadata columns (e.g. `label`, `siamese_score`, `weakness`) carried forward verbatim from the input. Print the output schema (`pd.read_parquet(...).columns`) to stdout so the script-check hook can confirm the embedding column exists.\n\nIf you need to override `model` \u002F `model_path` \u002F `batch_size` for one run without editing the spec, append them as Hydra overrides (e.g. `model_path=...`).\n\n### Step 2 — Embed the source pool\n\n```bash\n$DOCKER embedding image_embeddings \\\n    -e \u003Cembedding_spec.yaml> \\\n    input_parquet=\u003Csource_pool_parquet> \\\n    output_parquet=\u003Csource_embeddings_parquet>\n```\n\nSame command shape as Step 1, applied to the source pool. Use the **identical** `embedding_spec.yaml` as Step 1, and do not override `model` \u002F `model_path` \u002F `batch_size` differently here — mismatched encoder configs across the two steps produce non-comparable embeddings.\n\n### Step 3 — Mine nearest neighbours\n\n```bash\n$DOCKER tmm nearest_neighbors \\\n    -e \u003Cmining_spec.yaml> \\\n    source_parquet=\u003Csource_embeddings_parquet> \\\n    target_parquet=\u003Ctarget_embeddings_parquet> \\\n    output_parquet=\u003Cmined_parquet>\n```\n\nFor each target embedding, finds the `topn` closest source embeddings under the chosen metric, deduplicates across targets, and writes a single-column (`filepath`) parquet of unique mined source paths. The container also drops a `mining_summary.txt` next to the output parquet with: query count, neighbour count, duplicates removed, and (when label filtering is on) kept-vs-dropped pair counts. Tweak `topn`, `knn_metric`, or `filter_by_label` via inline Hydra override when sweeping (e.g. `topn=10`) — no need to rewrite the spec.\n\nWhen `filter_by_label=true` but one of the embedding parquets is missing the `label` column, the container logs a warning and proceeds without filtering. If the mined output looks larger than expected or contains cross-label pairs, scan the docker log for that warning before assuming the task did the right thing.\n\nSee `references\u002Freference-invocation.md` for the minimal paste-and-edit end-to-end recipe (resolves `$DS_IMAGE`, writes both specs, runs all three steps, chowns outputs, and prints row counts) to run as a single streamed Bash block.\n\n---\n\n## Outputs and report\n\nWrite everything into a timestamped folder under the experiment \u002F iteration directory. Get the real timestamp by running `date +%Y-%m-%d_%H%M%S` in Bash — do NOT hardcode or guess. If the user specifies a custom output path, use it directly but maintain the same internal layout. The packaging hook adds `mining_config\u002F` and `claude_session.jsonl` automatically when `Mining_Report.md` is written.\n\nThe mined parquet is the artifact downstream training consumes. The two embedding parquets are intermediate but worth retaining — reusable across multiple mining runs against the same source pool, and the only place to look when a \"looks unrelated\" report needs encoder-level debugging.\n\nSee `references\u002Foutputs-and-reporting.md` for the full output-directory layout and the verbatim `Mining_Report.md` template (Verdict, Inputs, Encoder Consistency, Mining Run, Per-Label Breakdown, Output Sanity, Recommended Actions; keep it 600–1200 words).\n\n---\n\n## Common pitfalls\n\nThe most frequent failure is **mismatched encoders between the two embedding steps** — the single most common cause of garbage mining output; both steps must consume the same `embedding_spec.yaml`. Other recurring traps: passing `--user` (the `getpwuid` `KeyError`), skipping an embedding step, a missing `label` column silently no-oping `filter_by_label=true`, spec files outside `$WORKSPACE`, unresolved `???` sentinels, TAO checkpoints without `model_config_path`, CSV source pools fed in directly, host\u002Fcontainer path mismatches, no GPU, an unpulled or `:latest` image tag, and `topn × N_targets ≫ source size` (expected — report the actual mined count).\n\nSee `references\u002Ftroubleshooting.md` for the full pitfall list with the exact errors, causes, and fixes.\n\n---\n\n## Execution Order\n\n1. Resolve `DS_IMAGE` from `versions.yaml` (`images.tao_toolkit.data_services`), then run `docker info`, `nvidia-smi`, and `docker image inspect \"$DS_IMAGE\"` (pulling if missing) once to confirm the environment. Abort with a clear message if any fail.\n2. Run `date +%Y-%m-%d_%H%M%S` to get the timestamp; create `\u003Coutput_dir>\u002Fmining_results\u002F\u003Ctimestamp>\u002F`.\n3. Write `embedding_spec.yaml` and `mining_spec.yaml` into the timestamped dir, filling in the encoder choice and mining knobs. Keep these under `$WORKSPACE` so the `-e` path resolves inside the container.\n4. If the source pool is a CSV, convert to parquet first (preserve `filepath` and `label`).\n5. Run Step 1 (embed targets) via `docker run … embedding image_embeddings -e embedding_spec.yaml input_parquet=… output_parquet=…`. Print the output parquet's row count and columns to stdout.\n6. Run Step 2 (embed source pool) with the **identical** `embedding_spec.yaml` as Step 1. Print output row count and columns.\n7. Run Step 3 (mine nearest neighbours) via `docker run … tmm nearest_neighbors -e mining_spec.yaml source_parquet=… target_parquet=… output_parquet=…`. Confirm `mining_summary.txt` was written next to `mined.parquet`.\n8. Compute the per-label breakdown (Section 5) by joining the target embeddings parquet with the mined output on filepath, if both carry `label`.\n9. Write `Mining_Report.md` last — writing it triggers the packaging hook, which copies session logs and skill config alongside.\n",{"data":31,"body":44},{"name":4,"description":6,"license":22,"compatibility":32,"metadata":33,"allowed-tools":36,"tags":37},"Requires docker + nvidia-container-toolkit and a CUDA GPU. Pulls the `tao_toolkit.data_services` image declared in `versions.yaml` at the skill bank root.",{"author":34,"version":35},"NVIDIA Corporation","0.1.0","Read Bash",[38,39,40,41,42,43],"data","mining","embedding","vcn","aoi","sda",{"type":45,"children":46},"root",[47,56,62,84,177,229,233,240,514,517,523,542,810,830,968,1012,1103,1132,1135,1141,1161,1168,1271,1318,1351,1357,1450,1487,1493,1616,1671,1691,1710,1713,1719,1755,1760,1779,1782,1788,1880,1892,1895,1901,2097],{"type":48,"tag":49,"props":50,"children":52},"element","h1",{"id":51},"deft-mining-and-embedding-skill",[53],{"type":54,"value":55},"text","DEFT Mining and Embedding Skill",{"type":48,"tag":57,"props":58,"children":59},"p",{},[60],{"type":54,"value":61},"You are the operator of the DEFT embed-then-mine workflow for VCN AOI. Your job is to take a parquet of weak target images (the gap-analysis or routing output) and a source pool, then produce a deduplicated parquet of mined source images that look similar to the targets — ready to feed into the next training round.",{"type":48,"tag":57,"props":63,"children":64},{},[65,67,73,75,82],{"type":54,"value":66},"The workflow is fixed and deterministic: ",{"type":48,"tag":68,"props":69,"children":70},"strong",{},[71],{"type":54,"value":72},"embed the targets, embed the source pool, then mine nearest neighbours.",{"type":54,"value":74}," Each step's output parquet is the next step's input. There is no iterative search, no clustering pass, no human-in-the-loop selection — depth comes from picking the right encoder and the right ",{"type":48,"tag":76,"props":77,"children":79},"code",{"className":78},[],[80],{"type":54,"value":81},"topn",{"type":54,"value":83},", not from a multi-phase investigation.",{"type":48,"tag":57,"props":85,"children":86},{},[87,89,95,97,103,105,111,113,119,121,127,129,135,137,143,145,151,153,159,161,167,169,175],{"type":54,"value":88},"The whole skill is a thin wrapper around three direct ",{"type":48,"tag":76,"props":90,"children":92},{"className":91},[],[93],{"type":54,"value":94},"docker run",{"type":54,"value":96}," invocations against the ",{"type":48,"tag":76,"props":98,"children":100},{"className":99},[],[101],{"type":54,"value":102},"tao_toolkit.data_services",{"type":54,"value":104}," image declared in ",{"type":48,"tag":76,"props":106,"children":108},{"className":107},[],[109],{"type":54,"value":110},"versions.yaml",{"type":54,"value":112}," (resolved at runtime — see Setup). The container's entrypoint takes ",{"type":48,"tag":76,"props":114,"children":116},{"className":115},[],[117],{"type":54,"value":118},"\u003Ccategory> \u003Caction> -e \u003Cspec.yaml> [hydra overrides...]",{"type":54,"value":120}," — pass ",{"type":48,"tag":76,"props":122,"children":124},{"className":123},[],[125],{"type":54,"value":126},"embedding image_embeddings -e \u003Cembedding_spec.yaml> …",{"type":54,"value":128}," for embedding and ",{"type":48,"tag":76,"props":130,"children":132},{"className":131},[],[133],{"type":54,"value":134},"tmm nearest_neighbors -e \u003Cmining_spec.yaml> …",{"type":54,"value":136}," for mining. The ",{"type":48,"tag":76,"props":138,"children":140},{"className":139},[],[141],{"type":54,"value":142},"-e",{"type":54,"value":144}," flag points at a YAML that supplies default values for the subtask's schema; anything afterward is a bare Hydra override (",{"type":48,"tag":76,"props":146,"children":148},{"className":147},[],[149],{"type":54,"value":150},"key=value",{"type":54,"value":152},") that selectively overrides spec fields per run. (There is no ",{"type":48,"tag":76,"props":154,"children":156},{"className":155},[],[157],{"type":54,"value":158},"dataset",{"type":54,"value":160}," keyword inside the container — that's the TAO launcher's pillar prefix and is dropped here.) Pull the image once if it isn't cached: ",{"type":48,"tag":76,"props":162,"children":164},{"className":163},[],[165],{"type":54,"value":166},"docker pull \"$DS_IMAGE\"",{"type":54,"value":168}," (after resolving ",{"type":48,"tag":76,"props":170,"children":172},{"className":171},[],[173],{"type":54,"value":174},"$DS_IMAGE",{"type":54,"value":176}," per Setup).",{"type":48,"tag":57,"props":178,"children":179},{},[180,182,188,190,196,198,204,205,211,213,219,221,227],{"type":54,"value":181},"Schema keys can rename between data-services releases (the RCA skill saw ",{"type":48,"tag":76,"props":183,"children":185},{"className":184},[],[186],{"type":54,"value":187},"inference_csv",{"type":54,"value":189}," → ",{"type":48,"tag":76,"props":191,"children":193},{"className":192},[],[194],{"type":54,"value":195},"inference_results_dir",{"type":54,"value":197},", ",{"type":48,"tag":76,"props":199,"children":201},{"className":200},[],[202],{"type":54,"value":203},"output_dir",{"type":54,"value":189},{"type":48,"tag":76,"props":206,"children":208},{"className":207},[],[209],{"type":54,"value":210},"results_dir",{"type":54,"value":212},"). When in doubt, introspect the actual schema once per image: ",{"type":48,"tag":76,"props":214,"children":216},{"className":215},[],[217],{"type":54,"value":218},"docker run --rm \"$DS_IMAGE\" embedding image_embeddings --cfg=job",{"type":54,"value":220}," and ",{"type":48,"tag":76,"props":222,"children":224},{"className":223},[],[225],{"type":54,"value":226},"... tmm nearest_neighbors --cfg=job",{"type":54,"value":228},".",{"type":48,"tag":230,"props":231,"children":232},"hr",{},[],{"type":48,"tag":234,"props":235,"children":237},"h2",{"id":236},"inputs",[238],{"type":54,"value":239},"Inputs",{"type":48,"tag":241,"props":242,"children":243},"ol",{},[244,302,333,418],{"type":48,"tag":245,"props":246,"children":247},"li",{},[248,253,255,261,263,269,271,277,278,284,286,292,294,300],{"type":48,"tag":68,"props":249,"children":250},{},[251],{"type":54,"value":252},"Target parquet",{"type":54,"value":254}," — the gap-analysis output, typically ",{"type":48,"tag":76,"props":256,"children":258},{"className":257},[],[259],{"type":54,"value":260},"mining_gaps.parquet",{"type":54,"value":262}," from ",{"type":48,"tag":76,"props":264,"children":266},{"className":265},[],[267],{"type":54,"value":268},"tao-route-visual-changenet-samples",{"type":54,"value":270}," (or ",{"type":48,"tag":76,"props":272,"children":274},{"className":273},[],[275],{"type":54,"value":276},"gaps.parquet",{"type":54,"value":262},{"type":48,"tag":76,"props":279,"children":281},{"className":280},[],[282],{"type":54,"value":283},"tao-analyze-gaps-visual-changenet",{"type":54,"value":285}," if routing was skipped). Required column: ",{"type":48,"tag":76,"props":287,"children":289},{"className":288},[],[290],{"type":54,"value":291},"filepath",{"type":54,"value":293},". If ",{"type":48,"tag":76,"props":295,"children":297},{"className":296},[],[298],{"type":54,"value":299},"label",{"type":54,"value":301}," is also present, label-aware filtering during mining is available; otherwise the mining task silently no-ops the filter.",{"type":48,"tag":245,"props":303,"children":304},{},[305,310,312,317,319,324,326,331],{"type":48,"tag":68,"props":306,"children":307},{},[308],{"type":54,"value":309},"Source pool",{"type":54,"value":311}," — a parquet of candidate images to mine against, with a ",{"type":48,"tag":76,"props":313,"children":315},{"className":314},[],[316],{"type":54,"value":291},{"type":54,"value":318}," column. If the user only has a CSV, convert it to a parquet ",{"type":48,"tag":68,"props":320,"children":321},{},[322],{"type":54,"value":323},"with the same columns",{"type":54,"value":325}," before Step 2. For label-aware filtering, the pool must also carry a ",{"type":48,"tag":76,"props":327,"children":329},{"className":328},[],[330],{"type":54,"value":299},{"type":54,"value":332}," column.",{"type":48,"tag":245,"props":334,"children":335},{},[336,341,343,349,350,356,357,363,365,370,372,378,380,386,388,394,396,402,403,409,411,416],{"type":48,"tag":68,"props":337,"children":338},{},[339],{"type":54,"value":340},"Embedding spec file",{"type":54,"value":342}," — a YAML containing ",{"type":48,"tag":76,"props":344,"children":346},{"className":345},[],[347],{"type":54,"value":348},"model",{"type":54,"value":197},{"type":48,"tag":76,"props":351,"children":353},{"className":352},[],[354],{"type":54,"value":355},"model_path",{"type":54,"value":197},{"type":48,"tag":76,"props":358,"children":360},{"className":359},[],[361],{"type":54,"value":362},"batch_size",{"type":54,"value":364},", and (only when ",{"type":48,"tag":76,"props":366,"children":368},{"className":367},[],[369],{"type":54,"value":355},{"type":54,"value":371}," is a TAO ",{"type":48,"tag":76,"props":373,"children":375},{"className":374},[],[376],{"type":54,"value":377},".pth",{"type":54,"value":379},"\u002F",{"type":48,"tag":76,"props":381,"children":383},{"className":382},[],[384],{"type":54,"value":385},".ckpt",{"type":54,"value":387},") ",{"type":48,"tag":76,"props":389,"children":391},{"className":390},[],[392],{"type":54,"value":393},"model_config_path",{"type":54,"value":395},". Reused across Steps 1 and 2; ",{"type":48,"tag":76,"props":397,"children":399},{"className":398},[],[400],{"type":54,"value":401},"input_parquet",{"type":54,"value":379},{"type":48,"tag":76,"props":404,"children":406},{"className":405},[],[407],{"type":54,"value":408},"output_parquet",{"type":54,"value":410}," are supplied per run as Hydra overrides. The ",{"type":48,"tag":68,"props":412,"children":413},{},[414],{"type":54,"value":415},"same",{"type":54,"value":417}," spec MUST drive both embedding steps — embeddings from different encoders are not comparable, and mismatched encoders are the most common cause of \"the mined images look unrelated\" reports.",{"type":48,"tag":245,"props":419,"children":420},{},[421,426,427,432,433,439,440,446,448,454,455,461,463,469,470,476,477,482,484,490,492,498,500,505,507,512],{"type":48,"tag":68,"props":422,"children":423},{},[424],{"type":54,"value":425},"Mining spec file",{"type":54,"value":342},{"type":48,"tag":76,"props":428,"children":430},{"className":429},[],[431],{"type":54,"value":81},{"type":54,"value":197},{"type":48,"tag":76,"props":434,"children":436},{"className":435},[],[437],{"type":54,"value":438},"knn_metric",{"type":54,"value":197},{"type":48,"tag":76,"props":441,"children":443},{"className":442},[],[444],{"type":54,"value":445},"filter_by_label",{"type":54,"value":447},", and (rarely changed) ",{"type":48,"tag":76,"props":449,"children":451},{"className":450},[],[452],{"type":54,"value":453},"source_embed_column_name",{"type":54,"value":379},{"type":48,"tag":76,"props":456,"children":458},{"className":457},[],[459],{"type":54,"value":460},"target_embed_column_name",{"type":54,"value":462},". ",{"type":48,"tag":76,"props":464,"children":466},{"className":465},[],[467],{"type":54,"value":468},"source_parquet",{"type":54,"value":379},{"type":48,"tag":76,"props":471,"children":473},{"className":472},[],[474],{"type":54,"value":475},"target_parquet",{"type":54,"value":379},{"type":48,"tag":76,"props":478,"children":480},{"className":479},[],[481],{"type":54,"value":408},{"type":54,"value":483}," are Hydra overrides at run time. SigLIP and CLIP embeddings should use ",{"type":48,"tag":76,"props":485,"children":487},{"className":486},[],[488],{"type":54,"value":489},"knn_metric: cosine",{"type":54,"value":491},". When ",{"type":48,"tag":76,"props":493,"children":495},{"className":494},[],[496],{"type":54,"value":497},"filter_by_label: true",{"type":54,"value":499}," but either embedding parquet lacks a ",{"type":48,"tag":76,"props":501,"children":503},{"className":502},[],[504],{"type":54,"value":299},{"type":54,"value":506}," column, the container logs a warning and proceeds ",{"type":48,"tag":68,"props":508,"children":509},{},[510],{"type":54,"value":511},"without",{"type":54,"value":513}," filtering.",{"type":48,"tag":230,"props":515,"children":516},{},[],{"type":48,"tag":234,"props":518,"children":520},{"id":519},"setup",[521],{"type":54,"value":522},"Setup",{"type":48,"tag":57,"props":524,"children":525},{},[526,528,533,535,540],{"type":54,"value":527},"Resolve the concrete ",{"type":48,"tag":76,"props":529,"children":531},{"className":530},[],[532],{"type":54,"value":102},{"type":54,"value":534}," URI from ",{"type":48,"tag":76,"props":536,"children":538},{"className":537},[],[539],{"type":54,"value":110},{"type":54,"value":541}," once at the top of the run, then confirm Docker, the NVIDIA container toolkit, and a GPU are present before doing anything else. A GPU is required for both the encoder forward pass and the cuML\u002FcuDF k-NN search; both steps fail without CUDA.",{"type":48,"tag":543,"props":544,"children":549},"pre",{"className":545,"code":546,"language":547,"meta":548,"style":548},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Resolve tao_toolkit.data_services → concrete nvcr.io\u002F... URI from versions.yaml\nDS_IMAGE=$(python3 -c \"import yaml,os; print(yaml.safe_load(open(os.environ['TAO_SKILL_BANK_PATH']+'\u002Fversions.yaml'))['images']['tao_toolkit']['data_services'])\")\necho \"DS_IMAGE=$DS_IMAGE\"\n\ndocker info > \u002Fdev\u002Fnull && echo \"OK: docker\"\nnvidia-smi > \u002Fdev\u002Fnull && echo \"OK: GPU\"\ndocker image inspect \"$DS_IMAGE\" > \u002Fdev\u002Fnull \\\n  || docker pull \"$DS_IMAGE\"\n","bash","",[550],{"type":48,"tag":76,"props":551,"children":552},{"__ignoreMap":548},[553,565,613,641,651,698,736,779],{"type":48,"tag":554,"props":555,"children":558},"span",{"class":556,"line":557},"line",1,[559],{"type":48,"tag":554,"props":560,"children":562},{"style":561},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[563],{"type":54,"value":564},"# Resolve tao_toolkit.data_services → concrete nvcr.io\u002F... URI from versions.yaml\n",{"type":48,"tag":554,"props":566,"children":568},{"class":556,"line":567},2,[569,575,581,587,593,598,603,608],{"type":48,"tag":554,"props":570,"children":572},{"style":571},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[573],{"type":54,"value":574},"DS_IMAGE",{"type":48,"tag":554,"props":576,"children":578},{"style":577},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[579],{"type":54,"value":580},"=$(",{"type":48,"tag":554,"props":582,"children":584},{"style":583},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[585],{"type":54,"value":586},"python3",{"type":48,"tag":554,"props":588,"children":590},{"style":589},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[591],{"type":54,"value":592}," -c",{"type":48,"tag":554,"props":594,"children":595},{"style":577},[596],{"type":54,"value":597}," \"",{"type":48,"tag":554,"props":599,"children":600},{"style":589},[601],{"type":54,"value":602},"import yaml,os; print(yaml.safe_load(open(os.environ['TAO_SKILL_BANK_PATH']+'\u002Fversions.yaml'))['images']['tao_toolkit']['data_services'])",{"type":48,"tag":554,"props":604,"children":605},{"style":577},[606],{"type":54,"value":607},"\"",{"type":48,"tag":554,"props":609,"children":610},{"style":577},[611],{"type":54,"value":612},")\n",{"type":48,"tag":554,"props":614,"children":616},{"class":556,"line":615},3,[617,623,627,632,636],{"type":48,"tag":554,"props":618,"children":620},{"style":619},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[621],{"type":54,"value":622},"echo",{"type":48,"tag":554,"props":624,"children":625},{"style":577},[626],{"type":54,"value":597},{"type":48,"tag":554,"props":628,"children":629},{"style":589},[630],{"type":54,"value":631},"DS_IMAGE=",{"type":48,"tag":554,"props":633,"children":634},{"style":571},[635],{"type":54,"value":174},{"type":48,"tag":554,"props":637,"children":638},{"style":577},[639],{"type":54,"value":640},"\"\n",{"type":48,"tag":554,"props":642,"children":644},{"class":556,"line":643},4,[645],{"type":48,"tag":554,"props":646,"children":648},{"emptyLinePlaceholder":647},true,[649],{"type":54,"value":650},"\n",{"type":48,"tag":554,"props":652,"children":654},{"class":556,"line":653},5,[655,660,665,670,675,680,685,689,694],{"type":48,"tag":554,"props":656,"children":657},{"style":583},[658],{"type":54,"value":659},"docker",{"type":48,"tag":554,"props":661,"children":662},{"style":589},[663],{"type":54,"value":664}," info",{"type":48,"tag":554,"props":666,"children":667},{"style":577},[668],{"type":54,"value":669}," >",{"type":48,"tag":554,"props":671,"children":672},{"style":589},[673],{"type":54,"value":674}," \u002Fdev\u002Fnull",{"type":48,"tag":554,"props":676,"children":677},{"style":577},[678],{"type":54,"value":679}," &&",{"type":48,"tag":554,"props":681,"children":682},{"style":619},[683],{"type":54,"value":684}," echo",{"type":48,"tag":554,"props":686,"children":687},{"style":577},[688],{"type":54,"value":597},{"type":48,"tag":554,"props":690,"children":691},{"style":589},[692],{"type":54,"value":693},"OK: docker",{"type":48,"tag":554,"props":695,"children":696},{"style":577},[697],{"type":54,"value":640},{"type":48,"tag":554,"props":699,"children":701},{"class":556,"line":700},6,[702,707,711,715,719,723,727,732],{"type":48,"tag":554,"props":703,"children":704},{"style":583},[705],{"type":54,"value":706},"nvidia-smi",{"type":48,"tag":554,"props":708,"children":709},{"style":577},[710],{"type":54,"value":669},{"type":48,"tag":554,"props":712,"children":713},{"style":589},[714],{"type":54,"value":674},{"type":48,"tag":554,"props":716,"children":717},{"style":577},[718],{"type":54,"value":679},{"type":48,"tag":554,"props":720,"children":721},{"style":619},[722],{"type":54,"value":684},{"type":48,"tag":554,"props":724,"children":725},{"style":577},[726],{"type":54,"value":597},{"type":48,"tag":554,"props":728,"children":729},{"style":589},[730],{"type":54,"value":731},"OK: GPU",{"type":48,"tag":554,"props":733,"children":734},{"style":577},[735],{"type":54,"value":640},{"type":48,"tag":554,"props":737,"children":739},{"class":556,"line":738},7,[740,744,749,754,758,762,766,770,774],{"type":48,"tag":554,"props":741,"children":742},{"style":583},[743],{"type":54,"value":659},{"type":48,"tag":554,"props":745,"children":746},{"style":589},[747],{"type":54,"value":748}," image",{"type":48,"tag":554,"props":750,"children":751},{"style":589},[752],{"type":54,"value":753}," inspect",{"type":48,"tag":554,"props":755,"children":756},{"style":577},[757],{"type":54,"value":597},{"type":48,"tag":554,"props":759,"children":760},{"style":571},[761],{"type":54,"value":174},{"type":48,"tag":554,"props":763,"children":764},{"style":577},[765],{"type":54,"value":607},{"type":48,"tag":554,"props":767,"children":768},{"style":577},[769],{"type":54,"value":669},{"type":48,"tag":554,"props":771,"children":772},{"style":589},[773],{"type":54,"value":674},{"type":48,"tag":554,"props":775,"children":776},{"style":571},[777],{"type":54,"value":778}," \\\n",{"type":48,"tag":554,"props":780,"children":782},{"class":556,"line":781},8,[783,788,793,798,802,806],{"type":48,"tag":554,"props":784,"children":785},{"style":577},[786],{"type":54,"value":787},"  ||",{"type":48,"tag":554,"props":789,"children":790},{"style":583},[791],{"type":54,"value":792}," docker",{"type":48,"tag":554,"props":794,"children":795},{"style":589},[796],{"type":54,"value":797}," pull",{"type":48,"tag":554,"props":799,"children":800},{"style":577},[801],{"type":54,"value":597},{"type":48,"tag":554,"props":803,"children":804},{"style":571},[805],{"type":54,"value":174},{"type":48,"tag":554,"props":807,"children":808},{"style":577},[809],{"type":54,"value":640},{"type":48,"tag":57,"props":811,"children":812},{},[813,815,820,822,828],{"type":54,"value":814},"Every host path the container reads or writes must be bind-mounted. The most predictable approach mounts the workspace root with ",{"type":48,"tag":68,"props":816,"children":817},{},[818],{"type":54,"value":819},"identical paths",{"type":54,"value":821}," inside and outside the container, then reuses one ",{"type":48,"tag":76,"props":823,"children":825},{"className":824},[],[826],{"type":54,"value":827},"$DOCKER",{"type":54,"value":829}," alias for the three invocations:",{"type":48,"tag":543,"props":831,"children":833},{"className":545,"code":832,"language":547,"meta":548,"style":548},"WORKSPACE=\u003Cabsolute path that contains all parquets, outputs, and the source-pool images>\nDOCKER=\"docker run --gpus all --rm --ipc=host -v $WORKSPACE:$WORKSPACE -w $WORKSPACE $DS_IMAGE\"\n",[834],{"type":48,"tag":76,"props":835,"children":836},{"__ignoreMap":548},[837,914],{"type":48,"tag":554,"props":838,"children":839},{"class":556,"line":557},[840,845,850,855,860,865,870,875,880,885,890,895,900,904,909],{"type":48,"tag":554,"props":841,"children":842},{"style":571},[843],{"type":54,"value":844},"WORKSPACE",{"type":48,"tag":554,"props":846,"children":847},{"style":577},[848],{"type":54,"value":849},"=\u003C",{"type":48,"tag":554,"props":851,"children":852},{"style":589},[853],{"type":54,"value":854},"absolute",{"type":48,"tag":554,"props":856,"children":857},{"style":583},[858],{"type":54,"value":859}," path",{"type":48,"tag":554,"props":861,"children":862},{"style":589},[863],{"type":54,"value":864}," that",{"type":48,"tag":554,"props":866,"children":867},{"style":589},[868],{"type":54,"value":869}," contains",{"type":48,"tag":554,"props":871,"children":872},{"style":589},[873],{"type":54,"value":874}," all",{"type":48,"tag":554,"props":876,"children":877},{"style":589},[878],{"type":54,"value":879}," parquets,",{"type":48,"tag":554,"props":881,"children":882},{"style":589},[883],{"type":54,"value":884}," outputs,",{"type":48,"tag":554,"props":886,"children":887},{"style":589},[888],{"type":54,"value":889}," and",{"type":48,"tag":554,"props":891,"children":892},{"style":589},[893],{"type":54,"value":894}," the",{"type":48,"tag":554,"props":896,"children":897},{"style":589},[898],{"type":54,"value":899}," source-pool",{"type":48,"tag":554,"props":901,"children":902},{"style":589},[903],{"type":54,"value":748},{"type":48,"tag":554,"props":905,"children":906},{"style":571},[907],{"type":54,"value":908},"s",{"type":48,"tag":554,"props":910,"children":911},{"style":577},[912],{"type":54,"value":913},">\n",{"type":48,"tag":554,"props":915,"children":916},{"class":556,"line":567},[917,922,927,931,936,941,946,950,955,959,964],{"type":48,"tag":554,"props":918,"children":919},{"style":571},[920],{"type":54,"value":921},"DOCKER",{"type":48,"tag":554,"props":923,"children":924},{"style":577},[925],{"type":54,"value":926},"=",{"type":48,"tag":554,"props":928,"children":929},{"style":577},[930],{"type":54,"value":607},{"type":48,"tag":554,"props":932,"children":933},{"style":589},[934],{"type":54,"value":935},"docker run --gpus all --rm --ipc=host -v ",{"type":48,"tag":554,"props":937,"children":938},{"style":571},[939],{"type":54,"value":940},"$WORKSPACE",{"type":48,"tag":554,"props":942,"children":943},{"style":589},[944],{"type":54,"value":945},":",{"type":48,"tag":554,"props":947,"children":948},{"style":571},[949],{"type":54,"value":940},{"type":48,"tag":554,"props":951,"children":952},{"style":589},[953],{"type":54,"value":954}," -w ",{"type":48,"tag":554,"props":956,"children":957},{"style":571},[958],{"type":54,"value":940},{"type":48,"tag":554,"props":960,"children":961},{"style":571},[962],{"type":54,"value":963}," $DS_IMAGE",{"type":48,"tag":554,"props":965,"children":966},{"style":577},[967],{"type":54,"value":640},{"type":48,"tag":57,"props":969,"children":970},{},[971,973,978,980,986,988,994,996,1002,1004,1010],{"type":54,"value":972},"Do ",{"type":48,"tag":68,"props":974,"children":975},{},[976],{"type":54,"value":977},"not",{"type":54,"value":979}," pass ",{"type":48,"tag":76,"props":981,"children":983},{"className":982},[],[984],{"type":54,"value":985},"--user $(id -u):$(id -g)",{"type":54,"value":987}," — it triggers a ",{"type":48,"tag":76,"props":989,"children":991},{"className":990},[],[992],{"type":54,"value":993},"getpwuid()",{"type":54,"value":995}," ",{"type":48,"tag":76,"props":997,"children":999},{"className":998},[],[1000],{"type":54,"value":1001},"KeyError",{"type":54,"value":1003}," during the ",{"type":48,"tag":76,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":54,"value":1009},"transformers",{"type":54,"value":1011}," import before any work starts. The container runs as root; chown outputs back to the host UID afterward.",{"type":48,"tag":57,"props":1013,"children":1014},{},[1015,1017,1022,1024,1029,1031,1036,1038,1043,1045,1051,1053,1059,1060,1066,1067,1073,1075,1081,1082,1088,1089,1094,1095,1101],{"type":54,"value":1016},"Author the two spec files once per iteration, placing them under ",{"type":48,"tag":76,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":54,"value":940},{"type":54,"value":1023}," so the ",{"type":48,"tag":76,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":54,"value":142},{"type":54,"value":1030}," argument resolves on both sides of the mount; per-run values stay out of the spec and are passed as Hydra overrides. If the source pool is a CSV, convert it to parquet up front (preserving ",{"type":48,"tag":76,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":54,"value":291},{"type":54,"value":1037},", and ",{"type":48,"tag":76,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":54,"value":299},{"type":54,"value":1044}," if present). The default ",{"type":48,"tag":76,"props":1046,"children":1048},{"className":1047},[],[1049],{"type":54,"value":1050},"embedding_spec.yaml",{"type":54,"value":1052}," uses ",{"type":48,"tag":76,"props":1054,"children":1056},{"className":1055},[],[1057],{"type":54,"value":1058},"model: SigLIP",{"type":54,"value":197},{"type":48,"tag":76,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":54,"value":1065},"model_path: google\u002Fsiglip-base-patch16-224",{"type":54,"value":197},{"type":48,"tag":76,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":54,"value":1072},"batch_size: 64",{"type":54,"value":1074},"; the default ",{"type":48,"tag":76,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":54,"value":1080},"mining_spec.yaml",{"type":54,"value":1052},{"type":48,"tag":76,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":54,"value":1087},"topn: 5",{"type":54,"value":197},{"type":48,"tag":76,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":54,"value":489},{"type":54,"value":197},{"type":48,"tag":76,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":54,"value":1100},"filter_by_label: \"false\"",{"type":54,"value":1102}," (quoted — the schema reads it as a string).",{"type":48,"tag":57,"props":1104,"children":1105},{},[1106,1108,1114,1116,1122,1124,1130],{"type":54,"value":1107},"See ",{"type":48,"tag":76,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":54,"value":1113},"references\u002Fsetup.md",{"type":54,"value":1115}," for the full environment notes, ",{"type":48,"tag":76,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":54,"value":1121},"TAO_SKILL_BANK_PATH",{"type":54,"value":1123}," handling, the path-mounting rationale, the ",{"type":48,"tag":76,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":54,"value":1129},"getpwuid",{"type":54,"value":1131}," chown workaround, the CSV-to-parquet snippet, and the verbatim spec-file authoring blocks.",{"type":48,"tag":230,"props":1133,"children":1134},{},[],{"type":48,"tag":234,"props":1136,"children":1138},{"id":1137},"method",[1139],{"type":54,"value":1140},"Method",{"type":48,"tag":57,"props":1142,"children":1143},{},[1144,1146,1151,1153,1159],{"type":54,"value":1145},"Three commands, in order. Each command's output parquet is the next command's input. Run them as plain Bash; the ",{"type":48,"tag":76,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":54,"value":827},{"type":54,"value":1152}," alias from Setup handles the container, GPU, and mounts. Every invocation follows the same shape: ",{"type":48,"tag":76,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":54,"value":1158},"-e \u003Cspec>",{"type":54,"value":1160}," for the baked-in defaults, then a handful of Hydra overrides for the run-specific paths.",{"type":48,"tag":1162,"props":1163,"children":1165},"h3",{"id":1164},"step-1-embed-the-target-images",[1166],{"type":54,"value":1167},"Step 1 — Embed the target images",{"type":48,"tag":543,"props":1169,"children":1171},{"className":545,"code":1170,"language":547,"meta":548,"style":548},"$DOCKER embedding image_embeddings \\\n    -e \u003Cembedding_spec.yaml> \\\n    input_parquet=\u003Ctarget_parquet> \\\n    output_parquet=\u003Ctarget_embeddings_parquet>\n",[1172],{"type":48,"tag":76,"props":1173,"children":1174},{"__ignoreMap":548},[1175,1183,1215,1246],{"type":48,"tag":554,"props":1176,"children":1177},{"class":556,"line":557},[1178],{"type":48,"tag":554,"props":1179,"children":1180},{"style":571},[1181],{"type":54,"value":1182},"$DOCKER embedding image_embeddings \\\n",{"type":48,"tag":554,"props":1184,"children":1185},{"class":556,"line":567},[1186,1191,1196,1201,1206,1211],{"type":48,"tag":554,"props":1187,"children":1188},{"style":583},[1189],{"type":54,"value":1190},"    -e",{"type":48,"tag":554,"props":1192,"children":1193},{"style":577},[1194],{"type":54,"value":1195}," \u003C",{"type":48,"tag":554,"props":1197,"children":1198},{"style":589},[1199],{"type":54,"value":1200},"embedding_spec.yam",{"type":48,"tag":554,"props":1202,"children":1203},{"style":571},[1204],{"type":54,"value":1205},"l",{"type":48,"tag":554,"props":1207,"children":1208},{"style":577},[1209],{"type":54,"value":1210},">",{"type":48,"tag":554,"props":1212,"children":1213},{"style":571},[1214],{"type":54,"value":778},{"type":48,"tag":554,"props":1216,"children":1217},{"class":556,"line":615},[1218,1223,1228,1233,1238,1242],{"type":48,"tag":554,"props":1219,"children":1220},{"style":589},[1221],{"type":54,"value":1222},"    input_parquet=",{"type":48,"tag":554,"props":1224,"children":1225},{"style":577},[1226],{"type":54,"value":1227},"\u003C",{"type":48,"tag":554,"props":1229,"children":1230},{"style":589},[1231],{"type":54,"value":1232},"target_parque",{"type":48,"tag":554,"props":1234,"children":1235},{"style":571},[1236],{"type":54,"value":1237},"t",{"type":48,"tag":554,"props":1239,"children":1240},{"style":577},[1241],{"type":54,"value":1210},{"type":48,"tag":554,"props":1243,"children":1244},{"style":571},[1245],{"type":54,"value":778},{"type":48,"tag":554,"props":1247,"children":1248},{"class":556,"line":643},[1249,1254,1258,1263,1267],{"type":48,"tag":554,"props":1250,"children":1251},{"style":589},[1252],{"type":54,"value":1253},"    output_parquet=",{"type":48,"tag":554,"props":1255,"children":1256},{"style":577},[1257],{"type":54,"value":1227},{"type":48,"tag":554,"props":1259,"children":1260},{"style":589},[1261],{"type":54,"value":1262},"target_embeddings_parque",{"type":48,"tag":554,"props":1264,"children":1265},{"style":571},[1266],{"type":54,"value":1237},{"type":48,"tag":554,"props":1268,"children":1269},{"style":577},[1270],{"type":54,"value":913},{"type":48,"tag":57,"props":1272,"children":1273},{},[1274,1276,1281,1282,1287,1289,1294,1295,1301,1302,1308,1310,1316],{"type":54,"value":1275},"Reads the gap-analysis \u002F routing output and writes a parquet with ",{"type":48,"tag":76,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":54,"value":291},{"type":54,"value":197},{"type":48,"tag":76,"props":1283,"children":1285},{"className":1284},[],[1286],{"type":54,"value":40},{"type":54,"value":1288},", and any extra metadata columns (e.g. ",{"type":48,"tag":76,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":54,"value":299},{"type":54,"value":197},{"type":48,"tag":76,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":54,"value":1300},"siamese_score",{"type":54,"value":197},{"type":48,"tag":76,"props":1303,"children":1305},{"className":1304},[],[1306],{"type":54,"value":1307},"weakness",{"type":54,"value":1309},") carried forward verbatim from the input. Print the output schema (",{"type":48,"tag":76,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":54,"value":1315},"pd.read_parquet(...).columns",{"type":54,"value":1317},") to stdout so the script-check hook can confirm the embedding column exists.",{"type":48,"tag":57,"props":1319,"children":1320},{},[1321,1323,1328,1330,1335,1336,1341,1343,1349],{"type":54,"value":1322},"If you need to override ",{"type":48,"tag":76,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":54,"value":348},{"type":54,"value":1329}," \u002F ",{"type":48,"tag":76,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":54,"value":355},{"type":54,"value":1329},{"type":48,"tag":76,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":54,"value":362},{"type":54,"value":1342}," for one run without editing the spec, append them as Hydra overrides (e.g. ",{"type":48,"tag":76,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":54,"value":1348},"model_path=...",{"type":54,"value":1350},").",{"type":48,"tag":1162,"props":1352,"children":1354},{"id":1353},"step-2-embed-the-source-pool",[1355],{"type":54,"value":1356},"Step 2 — Embed the source pool",{"type":48,"tag":543,"props":1358,"children":1360},{"className":545,"code":1359,"language":547,"meta":548,"style":548},"$DOCKER embedding image_embeddings \\\n    -e \u003Cembedding_spec.yaml> \\\n    input_parquet=\u003Csource_pool_parquet> \\\n    output_parquet=\u003Csource_embeddings_parquet>\n",[1361],{"type":48,"tag":76,"props":1362,"children":1363},{"__ignoreMap":548},[1364,1371,1398,1426],{"type":48,"tag":554,"props":1365,"children":1366},{"class":556,"line":557},[1367],{"type":48,"tag":554,"props":1368,"children":1369},{"style":571},[1370],{"type":54,"value":1182},{"type":48,"tag":554,"props":1372,"children":1373},{"class":556,"line":567},[1374,1378,1382,1386,1390,1394],{"type":48,"tag":554,"props":1375,"children":1376},{"style":583},[1377],{"type":54,"value":1190},{"type":48,"tag":554,"props":1379,"children":1380},{"style":577},[1381],{"type":54,"value":1195},{"type":48,"tag":554,"props":1383,"children":1384},{"style":589},[1385],{"type":54,"value":1200},{"type":48,"tag":554,"props":1387,"children":1388},{"style":571},[1389],{"type":54,"value":1205},{"type":48,"tag":554,"props":1391,"children":1392},{"style":577},[1393],{"type":54,"value":1210},{"type":48,"tag":554,"props":1395,"children":1396},{"style":571},[1397],{"type":54,"value":778},{"type":48,"tag":554,"props":1399,"children":1400},{"class":556,"line":615},[1401,1405,1409,1414,1418,1422],{"type":48,"tag":554,"props":1402,"children":1403},{"style":589},[1404],{"type":54,"value":1222},{"type":48,"tag":554,"props":1406,"children":1407},{"style":577},[1408],{"type":54,"value":1227},{"type":48,"tag":554,"props":1410,"children":1411},{"style":589},[1412],{"type":54,"value":1413},"source_pool_parque",{"type":48,"tag":554,"props":1415,"children":1416},{"style":571},[1417],{"type":54,"value":1237},{"type":48,"tag":554,"props":1419,"children":1420},{"style":577},[1421],{"type":54,"value":1210},{"type":48,"tag":554,"props":1423,"children":1424},{"style":571},[1425],{"type":54,"value":778},{"type":48,"tag":554,"props":1427,"children":1428},{"class":556,"line":643},[1429,1433,1437,1442,1446],{"type":48,"tag":554,"props":1430,"children":1431},{"style":589},[1432],{"type":54,"value":1253},{"type":48,"tag":554,"props":1434,"children":1435},{"style":577},[1436],{"type":54,"value":1227},{"type":48,"tag":554,"props":1438,"children":1439},{"style":589},[1440],{"type":54,"value":1441},"source_embeddings_parque",{"type":48,"tag":554,"props":1443,"children":1444},{"style":571},[1445],{"type":54,"value":1237},{"type":48,"tag":554,"props":1447,"children":1448},{"style":577},[1449],{"type":54,"value":913},{"type":48,"tag":57,"props":1451,"children":1452},{},[1453,1455,1460,1461,1466,1468,1473,1474,1479,1480,1485],{"type":54,"value":1454},"Same command shape as Step 1, applied to the source pool. Use the ",{"type":48,"tag":68,"props":1456,"children":1457},{},[1458],{"type":54,"value":1459},"identical",{"type":54,"value":995},{"type":48,"tag":76,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":54,"value":1050},{"type":54,"value":1467}," as Step 1, and do not override ",{"type":48,"tag":76,"props":1469,"children":1471},{"className":1470},[],[1472],{"type":54,"value":348},{"type":54,"value":1329},{"type":48,"tag":76,"props":1475,"children":1477},{"className":1476},[],[1478],{"type":54,"value":355},{"type":54,"value":1329},{"type":48,"tag":76,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":54,"value":362},{"type":54,"value":1486}," differently here — mismatched encoder configs across the two steps produce non-comparable embeddings.",{"type":48,"tag":1162,"props":1488,"children":1490},{"id":1489},"step-3-mine-nearest-neighbours",[1491],{"type":54,"value":1492},"Step 3 — Mine nearest neighbours",{"type":48,"tag":543,"props":1494,"children":1496},{"className":545,"code":1495,"language":547,"meta":548,"style":548},"$DOCKER tmm nearest_neighbors \\\n    -e \u003Cmining_spec.yaml> \\\n    source_parquet=\u003Csource_embeddings_parquet> \\\n    target_parquet=\u003Ctarget_embeddings_parquet> \\\n    output_parquet=\u003Cmined_parquet>\n",[1497],{"type":48,"tag":76,"props":1498,"children":1499},{"__ignoreMap":548},[1500,1508,1536,1564,1592],{"type":48,"tag":554,"props":1501,"children":1502},{"class":556,"line":557},[1503],{"type":48,"tag":554,"props":1504,"children":1505},{"style":571},[1506],{"type":54,"value":1507},"$DOCKER tmm nearest_neighbors \\\n",{"type":48,"tag":554,"props":1509,"children":1510},{"class":556,"line":567},[1511,1515,1519,1524,1528,1532],{"type":48,"tag":554,"props":1512,"children":1513},{"style":583},[1514],{"type":54,"value":1190},{"type":48,"tag":554,"props":1516,"children":1517},{"style":577},[1518],{"type":54,"value":1195},{"type":48,"tag":554,"props":1520,"children":1521},{"style":589},[1522],{"type":54,"value":1523},"mining_spec.yam",{"type":48,"tag":554,"props":1525,"children":1526},{"style":571},[1527],{"type":54,"value":1205},{"type":48,"tag":554,"props":1529,"children":1530},{"style":577},[1531],{"type":54,"value":1210},{"type":48,"tag":554,"props":1533,"children":1534},{"style":571},[1535],{"type":54,"value":778},{"type":48,"tag":554,"props":1537,"children":1538},{"class":556,"line":615},[1539,1544,1548,1552,1556,1560],{"type":48,"tag":554,"props":1540,"children":1541},{"style":589},[1542],{"type":54,"value":1543},"    source_parquet=",{"type":48,"tag":554,"props":1545,"children":1546},{"style":577},[1547],{"type":54,"value":1227},{"type":48,"tag":554,"props":1549,"children":1550},{"style":589},[1551],{"type":54,"value":1441},{"type":48,"tag":554,"props":1553,"children":1554},{"style":571},[1555],{"type":54,"value":1237},{"type":48,"tag":554,"props":1557,"children":1558},{"style":577},[1559],{"type":54,"value":1210},{"type":48,"tag":554,"props":1561,"children":1562},{"style":571},[1563],{"type":54,"value":778},{"type":48,"tag":554,"props":1565,"children":1566},{"class":556,"line":643},[1567,1572,1576,1580,1584,1588],{"type":48,"tag":554,"props":1568,"children":1569},{"style":589},[1570],{"type":54,"value":1571},"    target_parquet=",{"type":48,"tag":554,"props":1573,"children":1574},{"style":577},[1575],{"type":54,"value":1227},{"type":48,"tag":554,"props":1577,"children":1578},{"style":589},[1579],{"type":54,"value":1262},{"type":48,"tag":554,"props":1581,"children":1582},{"style":571},[1583],{"type":54,"value":1237},{"type":48,"tag":554,"props":1585,"children":1586},{"style":577},[1587],{"type":54,"value":1210},{"type":48,"tag":554,"props":1589,"children":1590},{"style":571},[1591],{"type":54,"value":778},{"type":48,"tag":554,"props":1593,"children":1594},{"class":556,"line":653},[1595,1599,1603,1608,1612],{"type":48,"tag":554,"props":1596,"children":1597},{"style":589},[1598],{"type":54,"value":1253},{"type":48,"tag":554,"props":1600,"children":1601},{"style":577},[1602],{"type":54,"value":1227},{"type":48,"tag":554,"props":1604,"children":1605},{"style":589},[1606],{"type":54,"value":1607},"mined_parque",{"type":48,"tag":554,"props":1609,"children":1610},{"style":571},[1611],{"type":54,"value":1237},{"type":48,"tag":554,"props":1613,"children":1614},{"style":577},[1615],{"type":54,"value":913},{"type":48,"tag":57,"props":1617,"children":1618},{},[1619,1621,1626,1628,1633,1635,1641,1643,1648,1649,1654,1656,1661,1663,1669],{"type":54,"value":1620},"For each target embedding, finds the ",{"type":48,"tag":76,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":54,"value":81},{"type":54,"value":1627}," closest source embeddings under the chosen metric, deduplicates across targets, and writes a single-column (",{"type":48,"tag":76,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":54,"value":291},{"type":54,"value":1634},") parquet of unique mined source paths. The container also drops a ",{"type":48,"tag":76,"props":1636,"children":1638},{"className":1637},[],[1639],{"type":54,"value":1640},"mining_summary.txt",{"type":54,"value":1642}," next to the output parquet with: query count, neighbour count, duplicates removed, and (when label filtering is on) kept-vs-dropped pair counts. Tweak ",{"type":48,"tag":76,"props":1644,"children":1646},{"className":1645},[],[1647],{"type":54,"value":81},{"type":54,"value":197},{"type":48,"tag":76,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":54,"value":438},{"type":54,"value":1655},", or ",{"type":48,"tag":76,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":54,"value":445},{"type":54,"value":1662}," via inline Hydra override when sweeping (e.g. ",{"type":48,"tag":76,"props":1664,"children":1666},{"className":1665},[],[1667],{"type":54,"value":1668},"topn=10",{"type":54,"value":1670},") — no need to rewrite the spec.",{"type":48,"tag":57,"props":1672,"children":1673},{},[1674,1676,1682,1684,1689],{"type":54,"value":1675},"When ",{"type":48,"tag":76,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":54,"value":1681},"filter_by_label=true",{"type":54,"value":1683}," but one of the embedding parquets is missing the ",{"type":48,"tag":76,"props":1685,"children":1687},{"className":1686},[],[1688],{"type":54,"value":299},{"type":54,"value":1690}," column, the container logs a warning and proceeds without filtering. If the mined output looks larger than expected or contains cross-label pairs, scan the docker log for that warning before assuming the task did the right thing.",{"type":48,"tag":57,"props":1692,"children":1693},{},[1694,1695,1701,1703,1708],{"type":54,"value":1107},{"type":48,"tag":76,"props":1696,"children":1698},{"className":1697},[],[1699],{"type":54,"value":1700},"references\u002Freference-invocation.md",{"type":54,"value":1702}," for the minimal paste-and-edit end-to-end recipe (resolves ",{"type":48,"tag":76,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":54,"value":174},{"type":54,"value":1709},", writes both specs, runs all three steps, chowns outputs, and prints row counts) to run as a single streamed Bash block.",{"type":48,"tag":230,"props":1711,"children":1712},{},[],{"type":48,"tag":234,"props":1714,"children":1716},{"id":1715},"outputs-and-report",[1717],{"type":54,"value":1718},"Outputs and report",{"type":48,"tag":57,"props":1720,"children":1721},{},[1722,1724,1730,1732,1738,1739,1745,1747,1753],{"type":54,"value":1723},"Write everything into a timestamped folder under the experiment \u002F iteration directory. Get the real timestamp by running ",{"type":48,"tag":76,"props":1725,"children":1727},{"className":1726},[],[1728],{"type":54,"value":1729},"date +%Y-%m-%d_%H%M%S",{"type":54,"value":1731}," in Bash — do NOT hardcode or guess. If the user specifies a custom output path, use it directly but maintain the same internal layout. The packaging hook adds ",{"type":48,"tag":76,"props":1733,"children":1735},{"className":1734},[],[1736],{"type":54,"value":1737},"mining_config\u002F",{"type":54,"value":220},{"type":48,"tag":76,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":54,"value":1744},"claude_session.jsonl",{"type":54,"value":1746}," automatically when ",{"type":48,"tag":76,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":54,"value":1752},"Mining_Report.md",{"type":54,"value":1754}," is written.",{"type":48,"tag":57,"props":1756,"children":1757},{},[1758],{"type":54,"value":1759},"The mined parquet is the artifact downstream training consumes. The two embedding parquets are intermediate but worth retaining — reusable across multiple mining runs against the same source pool, and the only place to look when a \"looks unrelated\" report needs encoder-level debugging.",{"type":48,"tag":57,"props":1761,"children":1762},{},[1763,1764,1770,1772,1777],{"type":54,"value":1107},{"type":48,"tag":76,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":54,"value":1769},"references\u002Foutputs-and-reporting.md",{"type":54,"value":1771}," for the full output-directory layout and the verbatim ",{"type":48,"tag":76,"props":1773,"children":1775},{"className":1774},[],[1776],{"type":54,"value":1752},{"type":54,"value":1778}," template (Verdict, Inputs, Encoder Consistency, Mining Run, Per-Label Breakdown, Output Sanity, Recommended Actions; keep it 600–1200 words).",{"type":48,"tag":230,"props":1780,"children":1781},{},[],{"type":48,"tag":234,"props":1783,"children":1785},{"id":1784},"common-pitfalls",[1786],{"type":54,"value":1787},"Common pitfalls",{"type":48,"tag":57,"props":1789,"children":1790},{},[1791,1793,1798,1800,1805,1807,1813,1815,1820,1821,1826,1828,1833,1835,1840,1842,1847,1849,1855,1857,1862,1864,1870,1872,1878],{"type":54,"value":1792},"The most frequent failure is ",{"type":48,"tag":68,"props":1794,"children":1795},{},[1796],{"type":54,"value":1797},"mismatched encoders between the two embedding steps",{"type":54,"value":1799}," — the single most common cause of garbage mining output; both steps must consume the same ",{"type":48,"tag":76,"props":1801,"children":1803},{"className":1802},[],[1804],{"type":54,"value":1050},{"type":54,"value":1806},". Other recurring traps: passing ",{"type":48,"tag":76,"props":1808,"children":1810},{"className":1809},[],[1811],{"type":54,"value":1812},"--user",{"type":54,"value":1814}," (the ",{"type":48,"tag":76,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":54,"value":1129},{"type":54,"value":995},{"type":48,"tag":76,"props":1822,"children":1824},{"className":1823},[],[1825],{"type":54,"value":1001},{"type":54,"value":1827},"), skipping an embedding step, a missing ",{"type":48,"tag":76,"props":1829,"children":1831},{"className":1830},[],[1832],{"type":54,"value":299},{"type":54,"value":1834}," column silently no-oping ",{"type":48,"tag":76,"props":1836,"children":1838},{"className":1837},[],[1839],{"type":54,"value":1681},{"type":54,"value":1841},", spec files outside ",{"type":48,"tag":76,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":54,"value":940},{"type":54,"value":1848},", unresolved ",{"type":48,"tag":76,"props":1850,"children":1852},{"className":1851},[],[1853],{"type":54,"value":1854},"???",{"type":54,"value":1856}," sentinels, TAO checkpoints without ",{"type":48,"tag":76,"props":1858,"children":1860},{"className":1859},[],[1861],{"type":54,"value":393},{"type":54,"value":1863},", CSV source pools fed in directly, host\u002Fcontainer path mismatches, no GPU, an unpulled or ",{"type":48,"tag":76,"props":1865,"children":1867},{"className":1866},[],[1868],{"type":54,"value":1869},":latest",{"type":54,"value":1871}," image tag, and ",{"type":48,"tag":76,"props":1873,"children":1875},{"className":1874},[],[1876],{"type":54,"value":1877},"topn × N_targets ≫ source size",{"type":54,"value":1879}," (expected — report the actual mined count).",{"type":48,"tag":57,"props":1881,"children":1882},{},[1883,1884,1890],{"type":54,"value":1107},{"type":48,"tag":76,"props":1885,"children":1887},{"className":1886},[],[1888],{"type":54,"value":1889},"references\u002Ftroubleshooting.md",{"type":54,"value":1891}," for the full pitfall list with the exact errors, causes, and fixes.",{"type":48,"tag":230,"props":1893,"children":1894},{},[],{"type":48,"tag":234,"props":1896,"children":1898},{"id":1897},"execution-order",[1899],{"type":54,"value":1900},"Execution Order",{"type":48,"tag":241,"props":1902,"children":1903},{},[1904,1951,1970,2001,2018,2031,2048,2075,2086],{"type":48,"tag":245,"props":1905,"children":1906},{},[1907,1909,1914,1915,1920,1922,1928,1930,1936,1937,1942,1943,1949],{"type":54,"value":1908},"Resolve ",{"type":48,"tag":76,"props":1910,"children":1912},{"className":1911},[],[1913],{"type":54,"value":574},{"type":54,"value":262},{"type":48,"tag":76,"props":1916,"children":1918},{"className":1917},[],[1919],{"type":54,"value":110},{"type":54,"value":1921}," (",{"type":48,"tag":76,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":54,"value":1927},"images.tao_toolkit.data_services",{"type":54,"value":1929},"), then run ",{"type":48,"tag":76,"props":1931,"children":1933},{"className":1932},[],[1934],{"type":54,"value":1935},"docker info",{"type":54,"value":197},{"type":48,"tag":76,"props":1938,"children":1940},{"className":1939},[],[1941],{"type":54,"value":706},{"type":54,"value":1037},{"type":48,"tag":76,"props":1944,"children":1946},{"className":1945},[],[1947],{"type":54,"value":1948},"docker image inspect \"$DS_IMAGE\"",{"type":54,"value":1950}," (pulling if missing) once to confirm the environment. Abort with a clear message if any fail.",{"type":48,"tag":245,"props":1952,"children":1953},{},[1954,1956,1961,1963,1969],{"type":54,"value":1955},"Run ",{"type":48,"tag":76,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":54,"value":1729},{"type":54,"value":1962}," to get the timestamp; create ",{"type":48,"tag":76,"props":1964,"children":1966},{"className":1965},[],[1967],{"type":54,"value":1968},"\u003Coutput_dir>\u002Fmining_results\u002F\u003Ctimestamp>\u002F",{"type":54,"value":228},{"type":48,"tag":245,"props":1971,"children":1972},{},[1973,1975,1980,1981,1986,1988,1993,1994,1999],{"type":54,"value":1974},"Write ",{"type":48,"tag":76,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":54,"value":1050},{"type":54,"value":220},{"type":48,"tag":76,"props":1982,"children":1984},{"className":1983},[],[1985],{"type":54,"value":1080},{"type":54,"value":1987}," into the timestamped dir, filling in the encoder choice and mining knobs. Keep these under ",{"type":48,"tag":76,"props":1989,"children":1991},{"className":1990},[],[1992],{"type":54,"value":940},{"type":54,"value":1023},{"type":48,"tag":76,"props":1995,"children":1997},{"className":1996},[],[1998],{"type":54,"value":142},{"type":54,"value":2000}," path resolves inside the container.",{"type":48,"tag":245,"props":2002,"children":2003},{},[2004,2006,2011,2012,2017],{"type":54,"value":2005},"If the source pool is a CSV, convert to parquet first (preserve ",{"type":48,"tag":76,"props":2007,"children":2009},{"className":2008},[],[2010],{"type":54,"value":291},{"type":54,"value":220},{"type":48,"tag":76,"props":2013,"children":2015},{"className":2014},[],[2016],{"type":54,"value":299},{"type":54,"value":1350},{"type":48,"tag":245,"props":2019,"children":2020},{},[2021,2023,2029],{"type":54,"value":2022},"Run Step 1 (embed targets) via ",{"type":48,"tag":76,"props":2024,"children":2026},{"className":2025},[],[2027],{"type":54,"value":2028},"docker run … embedding image_embeddings -e embedding_spec.yaml input_parquet=… output_parquet=…",{"type":54,"value":2030},". Print the output parquet's row count and columns to stdout.",{"type":48,"tag":245,"props":2032,"children":2033},{},[2034,2036,2040,2041,2046],{"type":54,"value":2035},"Run Step 2 (embed source pool) with the ",{"type":48,"tag":68,"props":2037,"children":2038},{},[2039],{"type":54,"value":1459},{"type":54,"value":995},{"type":48,"tag":76,"props":2042,"children":2044},{"className":2043},[],[2045],{"type":54,"value":1050},{"type":54,"value":2047}," as Step 1. Print output row count and columns.",{"type":48,"tag":245,"props":2049,"children":2050},{},[2051,2053,2059,2061,2066,2068,2074],{"type":54,"value":2052},"Run Step 3 (mine nearest neighbours) via ",{"type":48,"tag":76,"props":2054,"children":2056},{"className":2055},[],[2057],{"type":54,"value":2058},"docker run … tmm nearest_neighbors -e mining_spec.yaml source_parquet=… target_parquet=… output_parquet=…",{"type":54,"value":2060},". Confirm ",{"type":48,"tag":76,"props":2062,"children":2064},{"className":2063},[],[2065],{"type":54,"value":1640},{"type":54,"value":2067}," was written next to ",{"type":48,"tag":76,"props":2069,"children":2071},{"className":2070},[],[2072],{"type":54,"value":2073},"mined.parquet",{"type":54,"value":228},{"type":48,"tag":245,"props":2076,"children":2077},{},[2078,2080,2085],{"type":54,"value":2079},"Compute the per-label breakdown (Section 5) by joining the target embeddings parquet with the mined output on filepath, if both carry ",{"type":48,"tag":76,"props":2081,"children":2083},{"className":2082},[],[2084],{"type":54,"value":299},{"type":54,"value":228},{"type":48,"tag":245,"props":2087,"children":2088},{},[2089,2090,2095],{"type":54,"value":1974},{"type":48,"tag":76,"props":2091,"children":2093},{"className":2092},[],[2094],{"type":54,"value":1752},{"type":54,"value":2096}," last — writing it triggers the packaging hook, which copies session logs and skill config alongside.",{"type":48,"tag":2098,"props":2099,"children":2100},"style",{},[2101],{"type":54,"value":2102},"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":2104,"total":2263},[2105,2123,2141,2152,2164,2178,2191,2205,2218,2229,2243,2252],{"slug":2106,"name":2106,"fn":2107,"description":2108,"org":2109,"tags":2110,"stars":2120,"repoUrl":2121,"updatedAt":2122},"nemoclaw-user-guide","retrieve NemoClaw documentation and configuration","Guides human users' AI agents to the NemoClaw docs MCP server and canonical Fern documentation in Markdown form. Use when users ask how to install, configure, operate, troubleshoot, secure, or learn NemoClaw with an AI coding assistant. Trigger keywords - nemoclaw docs, use nemoclaw with ai agent, nemoclaw mcp docs, nemoclaw install help, nemoclaw quickstart, nemoclaw markdown docs, llms.txt, agent skills.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2111,2114,2117],{"name":2112,"slug":2113,"type":15},"Documentation","documentation",{"name":2115,"slug":2116,"type":15},"MCP","mcp",{"name":2118,"slug":2119,"type":15},"Search","search",21777,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FNemoClaw","2026-07-20T06:00:01.461044",{"slug":2124,"name":2124,"fn":2125,"description":2126,"org":2127,"tags":2128,"stars":2138,"repoUrl":2139,"updatedAt":2140},"mcore-build-and-dependency","manage Megatron-LM development environments","Container-based dev environment setup and dependency management for Megatron-LM. Covers acquiring and launching the CI container, uv package management, and updating uv.lock.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2129,2132,2135],{"name":2130,"slug":2131,"type":15},"Containers","containers",{"name":2133,"slug":2134,"type":15},"Deployment","deployment",{"name":2136,"slug":2137,"type":15},"Python","python",17049,"https:\u002F\u002Fgithub.com\u002FNVIDIA\u002FMegatron-LM","2026-07-27T06:06:11.249662",{"slug":2142,"name":2142,"fn":2143,"description":2144,"org":2145,"tags":2146,"stars":2138,"repoUrl":2139,"updatedAt":2151},"mcore-bump-base-image","update NVIDIA PyTorch base images","Bump the NVIDIA PyTorch base image (`nvcr.io\u002Fnvidia\u002Fpytorch:YY.MM-py3`) used by Megatron-LM CI. Covers the two pin sites (GitHub CI in `docker\u002F.ngc_version.dev` and GitLab CI in `.gitlab\u002Fstages\u002F01.build.yml`), the post-bump CI loop (re-run functional tests, refresh golden values, mark broken tests), and the gotchas that bit PRs",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2147,2150],{"name":2148,"slug":2149,"type":15},"CI\u002FCD","ci-cd",{"name":2133,"slug":2134,"type":15},"2026-07-14T05:25:59.97109",{"slug":2153,"name":2153,"fn":2154,"description":2155,"org":2156,"tags":2157,"stars":2138,"repoUrl":2139,"updatedAt":2163},"mcore-cicd","manage CI\u002FCD pipelines for Megatron-LM","CI\u002FCD reference for Megatron-LM. Covers CI pipeline structure, PR scope labels, triggering internal GitLab CI (which force-pushes the current branch to a pull-request\u002FBRANCH ref — always dry-run and verify the destination first; never run against shared or protected branches), and CI failure investigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2158,2159,2160],{"name":2148,"slug":2149,"type":15},{"name":2133,"slug":2134,"type":15},{"name":2161,"slug":2162,"type":15},"GitHub","github","2026-07-27T06:06:12.278222",{"slug":2165,"name":2165,"fn":2166,"description":2167,"org":2168,"tags":2169,"stars":2138,"repoUrl":2139,"updatedAt":2177},"mcore-create-issue","investigate CI failures and create issues","Investigate a failing GitHub Actions run or job and create a GitHub issue for the failure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2170,2173,2174],{"name":2171,"slug":2172,"type":15},"Debugging","debugging",{"name":2161,"slug":2162,"type":15},{"name":2175,"slug":2176,"type":15},"Triage","triage","2026-07-14T05:25:57.442089",{"slug":2179,"name":2179,"fn":2180,"description":2181,"org":2182,"tags":2183,"stars":2138,"repoUrl":2139,"updatedAt":2190},"mcore-linting-and-formatting","lint and format Megatron-LM code","Linting and formatting for Megatron-LM. Covers running autoformat.sh, tools (ruff, black, isort, pylint, mypy), and code style rules.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2184,2187],{"name":2185,"slug":2186,"type":15},"Best Practices","best-practices",{"name":2188,"slug":2189,"type":15},"Code Analysis","code-analysis","2026-07-14T05:25:56.18433",{"slug":2192,"name":2192,"fn":2193,"description":2194,"org":2195,"tags":2196,"stars":2138,"repoUrl":2139,"updatedAt":2204},"mcore-migrate-gpt-to-hybrid","migrate Megatron-LM models to HybridModel","Migration guide for moving Megatron Core GPTModel checkpoints, model providers, training commands, and layer mappings to HybridModel.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2197,2200,2203],{"name":2198,"slug":2199,"type":15},"Machine Learning","machine-learning",{"name":2201,"slug":2202,"type":15},"Migration","migration",{"name":9,"slug":8,"type":15},"2026-07-17T06:07:11.777011",{"slug":2206,"name":2206,"fn":2207,"description":2208,"org":2209,"tags":2210,"stars":2138,"repoUrl":2139,"updatedAt":2217},"mcore-onboard-gb200-1node-tests","onboard functional tests for GB200","Onboard 1-node GitHub MR functional tests for GB200 from existing mr-scoped 2-node tests.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2211,2214],{"name":2212,"slug":2213,"type":15},"QA","qa",{"name":2215,"slug":2216,"type":15},"Testing","testing","2026-07-14T05:25:53.673039",{"slug":2219,"name":2219,"fn":2220,"description":2221,"org":2222,"tags":2223,"stars":2138,"repoUrl":2139,"updatedAt":2228},"mcore-run-on-slurm","launch distributed training jobs on SLURM","How to launch distributed Megatron-LM training jobs on a SLURM cluster. Covers a minimal sbatch skeleton, environment-variable setup for torch.distributed.run, CUDA_DEVICE_MAX_CONNECTIONS rules across hardware and parallelism modes, container conventions, monitoring, and per-rank failure diagnosis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2224,2225],{"name":2133,"slug":2134,"type":15},{"name":2226,"slug":2227,"type":15},"Infrastructure","infrastructure","2026-07-14T05:25:49.362534",{"slug":2230,"name":2230,"fn":2231,"description":2232,"org":2233,"tags":2234,"stars":2138,"repoUrl":2139,"updatedAt":2242},"mcore-split-pr","split pull requests to reduce review load","Split a PR into multiple PRs to reduce the number of required CODEOWNERS reviewer groups.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2235,2238,2239],{"name":2236,"slug":2237,"type":15},"Code Review","code-review",{"name":2161,"slug":2162,"type":15},{"name":2240,"slug":2241,"type":15},"Pull Requests","pull-requests","2026-07-14T05:26:01.226578",{"slug":2244,"name":2244,"fn":2245,"description":2246,"org":2247,"tags":2248,"stars":2138,"repoUrl":2139,"updatedAt":2251},"mcore-testing","run and manage Megatron-LM tests","Test system for Megatron-LM. Covers test layout, recipe YAML structure, adding and running unit and functional tests, golden values, marker filters, and CI parity.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2249,2250],{"name":2212,"slug":2213,"type":15},{"name":2215,"slug":2216,"type":15},"2026-07-14T05:25:54.928983",{"slug":2253,"name":2253,"fn":2254,"description":2255,"org":2256,"tags":2257,"stars":2138,"repoUrl":2139,"updatedAt":2262},"nightly-sync","manage nightly main-to-dev sync workflows","Domain knowledge for the nightly main-to-dev sync workflow. Covers merge strategy, CI architecture, failure investigation, and known issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2258,2261],{"name":2259,"slug":2260,"type":15},"Automation","automation",{"name":2148,"slug":2149,"type":15},"2026-07-30T05:29:03.275638",496,{"items":2265,"total":2356},[2266,2281,2291,2305,2315,2328,2342],{"slug":2267,"name":2267,"fn":2268,"description":2269,"org":2270,"tags":2271,"stars":19,"repoUrl":20,"updatedAt":2280},"accelerated-computing-cudf","accelerate data processing with cuDF","Official NVIDIA-authored guidance for NVIDIA cuDF GPU DataFrames, pandas acceleration, dask-cuDF, ETL, joins, groupby, CSV\u002FParquet I\u002FO, nullable semantics, and multi-GPU DataFrame workloads.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2272,2273,2276,2277],{"name":13,"slug":14,"type":15},{"name":2274,"slug":2275,"type":15},"Data Engineering","data-engineering",{"name":9,"slug":8,"type":15},{"name":2278,"slug":2279,"type":15},"Performance","performance","2026-07-14T05:28:43.176466",{"slug":2282,"name":2282,"fn":2283,"description":2284,"org":2285,"tags":2286,"stars":19,"repoUrl":20,"updatedAt":2290},"aiq-deploy","deploy and manage NVIDIA AI-Q infrastructure","Use when asked to install, deploy, run, validate, troubleshoot, or stop NVIDIA AI-Q Blueprint infrastructure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2287,2288,2289],{"name":2133,"slug":2134,"type":15},{"name":2226,"slug":2227,"type":15},{"name":9,"slug":8,"type":15},"2026-07-14T05:29:06.667109",{"slug":2292,"name":2292,"fn":2293,"description":2294,"org":2295,"tags":2296,"stars":19,"repoUrl":20,"updatedAt":2304},"aiq-research","conduct deep research with AI-Q","Use when asked to run deep research or AI-Q research through a reachable NVIDIA AI-Q Blueprint backend.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2297,2300,2301],{"name":2298,"slug":2299,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":2302,"slug":2303,"type":15},"Research","research","2026-07-14T05:28:06.816956",{"slug":2306,"name":2306,"fn":2307,"description":2308,"org":2309,"tags":2310,"stars":19,"repoUrl":20,"updatedAt":2314},"amc-run-sample-calibration","run AMC sample dataset calibration","Run end-to-end calibration on the shipped sample dataset (sdg_08_2_sample_data_010926.zip) against a running AMC microservice. Use when user says 'test sample dataset', 'run sample calibration', 'verify AMC install', or 'launch and test'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2311,2312,2313],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":2215,"slug":2216,"type":15},"2026-07-17T05:29:03.913266",{"slug":2316,"name":2316,"fn":2317,"description":2318,"org":2319,"tags":2320,"stars":19,"repoUrl":20,"updatedAt":2327},"amc-run-video-calibration","calibrate video datasets with AutoMagicCalib","Calibrate a new dataset from pre-recorded video files via the AutoMagicCalib REST API. Use when user has local MP4s and says 'calibrate my videos', 'run AMC on these videos', or similar. For RTSP\u002Flive streams, use amc-run-rtsp-calibration instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2321,2322,2323,2324],{"name":2259,"slug":2260,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":2325,"slug":2326,"type":15},"Video","video","2026-07-17T05:28:53.905004",{"slug":2329,"name":2329,"fn":2330,"description":2331,"org":2332,"tags":2333,"stars":19,"repoUrl":20,"updatedAt":2341},"amc-setup-calibration-stack","deploy AutoMagicCalib microservice with Docker","Launch AutoMagicCalib microservice and web UI from NGC release images via Docker Compose. Use when user says 'deploy auto calibration', 'launch auto calibration', 'launch AMC', 'start MS+UI', or 'set up auto-magic-calib'. Requires NGC API key.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2334,2335,2337,2338],{"name":2133,"slug":2134,"type":15},{"name":2336,"slug":659,"type":15},"Docker",{"name":9,"slug":8,"type":15},{"name":2339,"slug":2340,"type":15},"Operations","operations","2026-07-17T05:28:56.913999",{"slug":2343,"name":2343,"fn":2344,"description":2345,"org":2346,"tags":2347,"stars":19,"repoUrl":20,"updatedAt":2355},"cudaq-guide","develop quantum applications with CUDA-Q","CUDA-Q onboarding guide for installation, test programs, GPU simulation, QPU hardware, and quantum applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":9},[2348,2349,2352],{"name":9,"slug":8,"type":15},{"name":2350,"slug":2351,"type":15},"Quantum Computing","quantum-computing",{"name":2353,"slug":2354,"type":15},"Simulation","simulation","2026-07-14T05:26:58.898253",305]