[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6PSFB547JVR06RHJ6MDPVFB":3,"skill-same:01M6PSFB547JVR06RHJ6MDPVFB":101},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":14,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M6PSFB547JVR06RHJ6MDPVFB","tao-run-on-lepton",null,"DGX Cloud Lepton managed GPU compute platform with run\u002Fstatus\u002Fcancel interface. Use when submitting TAO jobs to DGX Cloud, dispatching training\u002Feval\u002Finference to Lepton GPU resources, or managing Lepton workspace deployments. Trigger phrases include \"run on Lepton\", \"submit to DGX Cloud\", \"Lepton job\", \"managed GPU on DGX Cloud\".","headmktlucca-ui\u002Fneuroads-lp","headmktlucca-ui","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F247379838?v=4","01M6PDVAV6M1W96D1SR1PDF8CS","NeuroAds","01M6PDVAZ4P281GNDKD45CYTF5",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftao-run-on-lepton\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"tao run on lepton","lepton","run","tao","token","dgx-cloud","managed","interface","resources","submit","platform","auth","install","read","eval","extra","Bash","NVIDIA","training","status","2026-11-10 10:12:30",false,"---\nname: tao-run-on-lepton\ndescription: DGX Cloud Lepton managed GPU compute platform with run\u002Fstatus\u002Fcancel interface. Use when submitting TAO jobs\n  to DGX Cloud, dispatching training\u002Feval\u002Finference to Lepton GPU resources, or managing Lepton workspace deployments.\n  Trigger phrases include \"run on Lepton\", \"submit to DGX Cloud\", \"Lepton job\", \"managed GPU on DGX Cloud\".\nlicense: Apache-2.0\ncompatibility: Requires the tao-sdk Python package with the lepton extra (pip install 'tao-sdk[lepton]') plus LEPTON_WORKSPACE_ID\n  and LEPTON_AUTH_TOKEN.\nmetadata:\n  author: NVIDIA Corporation\n  version: \"0.1.0\"\nallowed-tools: Read Bash\ntags:\n- dgx-cloud\n- gpu\n- compute\n- lepton\n---\n\n# Lepton\n\nManaged GPU compute platform on DGX Cloud. Jobs are submitted as container workloads that run on dedicated or shared GPU node groups. Lepton handles scheduling, image pulling, log collection, and job lifecycle.\n\nUse Lepton when you need cloud-based GPU compute without managing Kubernetes or SLURM infrastructure directly.\n\n## Preflight\n\nLepton is API-first — no docker-run alternative. This skill needs the TAO SDK with the Lepton extra. `nvidia-tao-sdk` is on public PyPI; the pinned version lives in `versions.yaml` (`wheels.tao_sdk_lepton`), resolved via `scripts\u002Fresolve_versions_key.py`:\n\n```bash\nPIN=$(\"${TAO_SKILL_BANK_PATH:?}\u002Fscripts\u002Fresolve_versions_key.py\" wheels.tao_sdk_lepton)\npython -c \"import tao_sdk\" 2>\u002Fdev\u002Fnull || {\n  echo \"MISSING: nvidia-tao-sdk not installed. Run:\"\n  echo \"  pip install \\\"$PIN\\\"\"\n  exit 1\n}\npython -c \"import leptonai\" 2>\u002Fdev\u002Fnull || {\n  echo \"MISSING: lepton extra not installed. Run:\"\n  echo \"  pip install \\\"$PIN\\\"\"\n  exit 1\n}\n```\n\nIf missing, the agent prompts the user to authorize the install via Bash, then re-runs the preflight before continuing.\n\n## Credentials\n\n- **LEPTON_WORKSPACE_ID** (required): Determines which cluster and billing account the job runs under.\n- **LEPTON_AUTH_TOKEN** (required): API token for authenticating with the Lepton control plane.\n- **NGC_KEY** (optional): Used to create image pull secrets for pulling TAO container images from nvcr.io.\n- **ACCESS_KEY** \u002F **SECRET_KEY** (optional): S3-compatible storage keys for dataset and checkpoint URIs.\n- **S3_ENDPOINT_URL** (optional): Custom S3 endpoint (e.g., for MinIO or non-AWS S3).\n- **S3_BUCKET_NAME** (optional): Bucket for job output artifacts.\n- **CLOUD_REGION** (optional): Storage region (e.g., us-east-1).\n\n## Launch Preflight\n\nBefore generating scripts or submitting jobs:\n\n1. Verify `LEPTON_WORKSPACE_ID` and `LEPTON_AUTH_TOKEN` are set.\n2. Verify the workspace API is reachable with the packaged helper:\n   `scripts\u002Fcheck_tao_launch_preflight.py --platform lepton ...`.\n3. For `s3:\u002F\u002F` datasets\u002Fresults, verify `ACCESS_KEY` and `SECRET_KEY` are set\n   and the exact paths are readable with `aws s3 ls`.\n4. For NFS\u002FLustre mounted paths, require proof from Lepton volume\u002Fstorage\n   permissions that the path will be mounted into the job. Do not treat a local\n   filesystem `test -e` on the agent host as proof for Lepton jobs.\n5. Verify model-specific credentials such as `HF_TOKEN` before launch.\n\n## Backend Details\n\n`LeptonSDK.create_job` accepts these Lepton-specific kwargs (in addition to the platform-agnostic ones — `image`, `command`, `gpu_count`, `env_vars`, `inputs`, `outputs`, `hooks`):\n\n- **`resource_shape`**: explicit GPU resource shape ID (e.g., `\"gpu.8xh100-sxm\"`). When set, skips the auto-resolution from `gpu_count`. The format is opaque (whatever Lepton's API returns as instance metadata.id) — discover valid IDs via `sdk.list_resource_shapes()`.\n- **`dedicated_node_group`**: node group ID for guaranteed GPU allocation (no preemption). Omit for shared resources.\n- **`num_nodes`**: number of nodes for distributed training. Default 1. When > 1, enables intra-job communication and PyTorch distributed initialization (see [Multi-node training](#multi-node-training-distributed)).\n- **`mounts`**: pre-built `Mount` objects for NFS \u002F Lustre. Auto-detected from the node group when not set.\n\n### Discovering the workspace's shapes \u002F volumes\n\n```python\nshapes = sdk.list_resource_shapes()\n# {\u003Cplatform_id>: {\"cluster\": ..., \"gpu_type\": \"gpu.8xh100-sxm\",\n#                   \"gpu_count\": 8, \"instance_type\": ..., ...}, ...}\n\nvolumes = sdk.get_volumes(node_group_id=\"my-h100-pool\")\n# [{\"name\": \"lustre\", \"from_path\": \"\u002Flustre\", \"type\": \"Lustre\"}, ...]\n\nprefixes = sdk.get_storage_permissions(\"lustre\", \"my-h100-pool\")\n# [\"\u002Flustre\u002Ffsw\u002Fportfolios\u002Fedgeai\u002F...\", ...]\n```\n\n## Multi-node training (distributed)\n\nPass `num_nodes > 1` to `create_job` for multi-node distributed training. The Lepton handler (`tao_sdk\u002Fplatforms\u002Flepton\u002Fhandler.py`) configures the underlying `LeptonJob` by setting `intra_job_communication=True` (opens pod-to-pod networking), `parallelism=num_nodes` and `completions=num_nodes` (Lepton schedules N replicas), and exports `WORLD_SIZE=num_nodes` as a container env var.\n\nLepton's native per-replica env vars use Lepton-specific names (`LEPTON_JOB_WORKER_INDEX`, `LEPTON_JOB_TOTAL_WORKERS`, `LEPTON_JOB_WORKER_PREFIX`, `LEPTON_SUBDOMAIN`), so the handler prepends a bootstrap that sources Lepton's official translation script:\n\n```bash\nwget -O init.sh https:\u002F\u002Fraw.githubusercontent.com\u002Fleptonai\u002Fscripts\u002Fmain\u002Flepton_env_to_pytorch.sh\nchmod +x init.sh\nsource init.sh\n# user command runs here\n```\n\nAfter sourcing, the following env vars are set:\n\n| Env var | Source | Value |\n|---|---|---|\n| `MASTER_ADDR` | script | `${LEPTON_JOB_WORKER_PREFIX}-0.${LEPTON_SUBDOMAIN}` |\n| `MASTER_PORT` | script | `29400` |\n| `NNODES` | script | `${LEPTON_JOB_TOTAL_WORKERS}` |\n| `NODE_RANK` | script | `${LEPTON_JOB_WORKER_INDEX}` |\n| `WORKER_ADDRS` | script | comma-separated list of non-master worker hostnames |\n| `WORLD_SIZE` | TAO SDK handler | `num_nodes` (TAO container's convention — same value as `NNODES`) |\n| `NUM_GPU_PER_NODE` | TAO SDK handler | `gpu_count` (read by TAO container's entrypoint) |\n\n```python\njob = sdk.create_job(\n    image='nvcr.io\u002Fnvidia\u002Ftao\u002Ftao-toolkit:6.26.3-pyt',\n    command='dino train -e \u002Ftmp\u002Fspec.yaml',  # TAO entrypoint reads WORLD_SIZE + NUM_GPU_PER_NODE\n    gpu_count=8,                          # GPUs per node\n    num_nodes=4,                          # 4 × 8 = 32 GPUs total\n    dedicated_node_group='my-h100-pool',\n    inputs={'\u002Fdata\u002Ftrain.json': 's3:\u002F\u002Fbucket\u002Fcoco\u002Ftrain.json'},\n    outputs=['\u002Fresults\u002F'],\n)\n```\n\nFor raw `torchrun`-based commands (non-TAO containers):\n\n```python\ncommand='torchrun --nnodes=$NNODES --nproc-per-node=8 --node-rank=$NODE_RANK '\n        '--master-addr=$MASTER_ADDR --master-port=$MASTER_PORT train.py'\n```\n\n### Two ways to run distributed jobs on Lepton\n\n| Path | When to use |\n|---|---|\n| **TAO SDK `create_job(num_nodes=N)`** (this skill) | Programmatic submission from agent code; you want the SDK's S3 wrapping, monitoring, failure analysis, and JobStore. |\n| **Lepton \"Torchrun\" job type** (Lepton UI \u002F lep CLI) | Hand-crafted submission via the Lepton console. Lepton's UI has a first-class \"Torchrun\" mode that wires up the rendezvous for you — no bootstrap script needed. See the [official example](https:\u002F\u002Fdocs.nvidia.com\u002Fdgx-cloud\u002Flepton\u002Fexamples\u002Fbatch-job\u002Fdistributed-training-with-pytorch\u002F). |\n\n### Reference reading\n\n- NVIDIA's Lepton multi-node PyTorch example (UI \u002F Torchrun mode): \u003Chttps:\u002F\u002Fdocs.nvidia.com\u002Fdgx-cloud\u002Flepton\u002Fexamples\u002Fbatch-job\u002Fdistributed-training-with-pytorch\u002F>\n- The translation script the SDK sources: \u003Chttps:\u002F\u002Fgithub.com\u002Fleptonai\u002Fscripts\u002Fblob\u002Fmain\u002Flepton_env_to_pytorch.sh>\n- PyTorch distributed (env-var rendezvous): \u003Chttps:\u002F\u002Fpytorch.org\u002Fdocs\u002Fstable\u002Felastic\u002Frun.html>\n- NCCL networking tuning: \u003Chttps:\u002F\u002Fdocs.nvidia.com\u002Fdeeplearning\u002Fnccl\u002Fuser-guide\u002Fdocs\u002Fenv.html>\n\n### Notes\n\n- Prefer `dedicated_node_group` for multi-node to keep replicas on the same low-latency interconnect (NVLink \u002F InfiniBand).\n- If a replica is preempted on a shared node group, the whole job fails — Lepton doesn't elastically restart in v1. Use a dedicated node group for long runs.\n- For Lustre-backed datasets, the same mount is exposed to every replica — no per-replica I\u002FO wrapping needed.\n\n## Cloud Storage\n\nEven though the platform is Lepton, the storage layer is S3-compatible. Always use `aws` as the `cloud_metadata` key and `s3:\u002F\u002F` as the URI protocol for both datasets and `results_dir`.\n\n- Correct: `s3:\u002F\u002Fbucket-name\u002Fpath`\n- Incorrect: `lepton:\u002F\u002Fbucket-name\u002Fpath`\n\nThe container's `get_cloud_storage_class_object()` parses the URI protocol to look up credentials in `CLOUD_METADATA[protocol][bucket]`.\n\n## Shared Storage (NFS\u002FLustre)\n\nNode groups can have NFS or Lustre volumes attached. The SDK auto-detects these and mounts them into containers for persistent cross-job data sharing.\n\n### SDK Functions\n\n- `sdk.get_volumes(node_group_id=None)` — returns available volumes (name, from_path, type) from node group spec\n- `sdk.get_storage_permissions(volume_name, node_group_id)` — returns allowed path prefixes for a volume\n\n`LeptonSDK.create_job()` calls these automatically to detect mounts and build the appropriate `Mount` objects for job specs.\n\n### How the script runner uses mounts\n\nWhen a Lustre mount is available:\n- **Inputs**: S3 paths are mapped to Lustre (`s3:\u002F\u002Fbucket\u002Fpath` → `\u002Fmnt\u002Flustre\u002Fbucket\u002Fpath`). If the file exists on Lustre, it's used directly (zero download). If missing, it's downloaded from S3 to Lustre and persists for future jobs.\n- **Outputs**: Results write to Lustre first (fast, persistent), then upload to S3 (durable). Downstream jobs (e.g., gap analysis) can read results directly from Lustre without an S3 round-trip.\n\n### Volume preference order\n\nlustre > filestore > first available\n\n### Lustre Cache Invalidation\n\nLustre caches files persistently across jobs. There is no built-in invalidation. If upstream data changes but the S3 path stays the same, Lustre serves the stale cached version. To force a cache miss:\n\n- **Rename the file** on S3 (e.g., `prompt_v2.txt` instead of overwriting `prompt.txt`)\n- **Use a new storage_root** between iterations to avoid cross-iteration staleness\n- **Use a new path** for any regenerated artifacts\n\n## Monitoring\n\n### Job Status\nUse `sdk.get_job_status(job_id)` for high-level status (Pending, Running, Complete, Error).\n\n### Replica Status\nUse `sdk.get_job_replicas(job_id)` during startup for detailed replica-level info. Each replica is a dict:\n\n```python\nreplicas = sdk.get_job_replicas(job_id)\nfor r in replicas:\n    node = r[\"status\"][\"node\"][\"name\"]           # e.g., \"node-ip-10-50-111-24\"\n    node_group = r[\"status\"][\"node\"][\"node_group_id\"]\n    cpu = r[\"status\"][\"cpu\"]                      # e.g., 2\n    memory_mb = r[\"status\"][\"memory_in_mb\"]       # e.g., 8192\n    readiness = r[\"status\"].get(\"readiness_issue\")\n    if readiness:\n        reason = readiness[\"reason\"]   # \"InProgress\", \"Failed\", \"ConfigError\"\n        message = readiness[\"message\"] # \"Pulling image\", \"Mount point not found\", etc.\n```\n\nKey readiness_issue patterns:\n- `reason=\"InProgress\"`, `message=\"Pulling image\"` — image pull in progress (normal for large images)\n- `reason=\"Failed\"` — image pull failed (check NGC_KEY)\n- `reason=\"ConfigError\"` — node issue (mount failure, GPU error)\n- No `readiness_issue` — replica is running\n\nReplica status is especially useful when a job is stuck in Pending — it reveals whether the issue is image pulling, resource scheduling, or node health.\n\n### Job Logs\nUse `sdk.get_job_logs(job_id, tail=N)` for the most recent N log lines. Logs are fetched from Lepton's log collection service.\n\n### Parallel Jobs\nFor workflow stages that run in parallel (e.g., video generation x8):\n\n1. **Launch:** Call `execute_step(plan, step_id, extra_args={\"split_id\": i})` for each split. Each call returns immediately with a job_id.\n2. **Monitor:** Poll all jobs: `sdk.get_job_status(job_id)` for each. Use `get_job_replicas(job_id)` for startup diagnostics.\n3. **Completion:** All jobs done when every status is `Complete` or `Error`.\n4. **Partial failure:** Retry only failed splits — successful splits don't need re-running. Pass the same `split_id` to `execute_step`.\n\n## Failure Analysis\n\nWhen a job fails, use `sdk.get_failure_analysis(job_id)` for automatic root cause detection:\n\n```python\nanalysis = sdk.get_failure_analysis(job_id)\nif analysis:\n    print(analysis[\"err_class\"])    # e.g., \"ERR_PROGRAM\"\n    print(analysis[\"suggestion\"])   # Human-readable fix\n    for event in analysis.get(\"job_failure_by_node_event\", []):\n        print(event[\"node_event_name\"], event[\"message\"])\n        # e.g., \"OOM\", \"OOM encountered, victim process: cosmos-rl-evalu, pid: 3368483\"\n```\n\nReturns:\n- `err_class`: Error classification (`ERR_PROGRAM`, `ERR_INFRA`, etc.)\n- `suggestion`: What likely went wrong and how to fix it\n- `job_failure_by_node_event`: Node-level events (OOM kills, GPU errors, mount failures)\n- `log_streams`: Relevant log snippets with error context\n\nAlways call this on failed jobs before retrying — it distinguishes user errors (bad config, OOM) from infrastructure issues (node failure, eviction).\n\n## Failure Modes\n\n**OOM killed**: Container exceeded GPU or system memory. Detection: `get_failure_analysis()` returns `node_event_name: \"OOM\"`. Common causes: `evaluation.batch_size` too high, `max_length` too large for available KV cache. Recovery: reduce batch_size, add GPUs with tensor parallelism, or reduce max_length.\n\n**Image pull failure**: The TAO container image cannot be pulled from nvcr.io. Usually caused by a missing or expired image pull secret. The SDK auto-provisions the secret from NGC_KEY, but if NGC_KEY is invalid, the job will fail. Detection: check `get_job_replicas()` — `readiness_issue.reason` will show `InProgress` with `message = \"Pulling image\"` for extended periods, or `Failed` if the pull fails. Recovery: verify NGC_KEY is valid.\n\n**Resource unavailable**: The requested GPU shape is not available. Job enters Queueing state indefinitely. Detection: Pending > 15 minutes, replicas show no node assignment. Recovery: try a different resource_shape or dedicated_node_group, or wait for resources.\n\n**Auth failure**: Invalid or expired LEPTON_AUTH_TOKEN. All API calls fail with 401\u002F403. Detection: job creation raises an exception immediately. Recovery: refresh the token and reinitialize the SDK.\n\n**Unhealthy node**: The assigned node has infrastructure issues (mount failures, GPU errors, network problems). Detection: check `get_job_replicas()` — `readiness_issue.reason = \"ConfigError\"` with messages like `\"Mount point not found\"`. The job stays Pending indefinitely on the bad node. Recovery: cancel the job and resubmit — Lepton will schedule on a different node. If the issue recurs, try a different `dedicated_node_group` or `resource_shape`.\n\n**Job eviction**: On shared node groups, Lepton may evict jobs under resource pressure. Detection: job unexpectedly transitions from Running to Error. Recovery: retry, or use a dedicated_node_group.\n","# Lepton\n\nManaged GPU compute platform on DGX Cloud. Jobs are submitted as container workloads that run on dedicated or shared GPU node groups. Lepton handles scheduling, image pulling, log collection, and job lifecycle.\n\nUse Lepton when you need cloud-based GPU compute without managing Kubernetes or SLURM infrastructure directly.\n\n## Preflight\n\nLepton is API-first — no docker-run alternative. This skill needs the TAO SDK with the Lepton extra. `nvidia-tao-sdk` is on public PyPI; the pinned version lives in `versions.yaml` (`wheels.tao_sdk_lepton`), resolved via `scripts\u002Fresolve_versions_key.py`:\n\n```bash\nPIN=$(\"${TAO_SKILL_BANK_PATH:?}\u002Fscripts\u002Fresolve_versions_key.py\" wheels.tao_sdk_lepton)\npython -c \"import tao_sdk\" 2>\u002Fdev\u002Fnull || {\n  echo \"MISSING: nvidia-tao-sdk not installed. Run:\"\n  echo \"  pip install \\\"$PIN\\\"\"\n  exit 1\n}\npython -c \"import leptonai\" 2>\u002Fdev\u002Fnull || {\n  echo \"MISSING: lepton extra not installed. Run:\"\n  echo \"  pip install \\\"$PIN\\\"\"\n  exit 1\n}\n```\n\nIf missing, the agent prompts the user to authorize the install via Bash, then re-runs the preflight before continuing.\n\n## Credentials\n\n- **LEPTON_WORKSPACE_ID** (required): Determines which cluster and billing account the job runs under.\n- **LEPTON_AUTH_TOKEN** (required): API token for authenticating with the Lepton control plane.\n- **NGC_KEY** (optional): Used to create image pull secrets for pulling TAO container images from nvcr.io.\n- **ACCESS_KEY** \u002F **SECRET_KEY** (optional): S3-compatible storage keys for dataset and checkpoint URIs.\n- **S3_ENDPOINT_URL** (optional): Custom S3 endpoint (e.g., for MinIO or non-AWS S3).\n- **S3_BUCKET_NAME** (optional): Bucket for job output artifacts.\n- **CLOUD_REGION** (optional): Storage region (e.g., us-east-1).\n\n## Launch Preflight\n\nBefore generating scripts or submitting jobs:\n\n1. Verify `LEPTON_WORKSPACE_ID` and `LEPTON_AUTH_TOKEN` are set.\n2. Verify the workspace API is reachable with the packaged helper:\n   `scripts\u002Fcheck_tao_launch_preflight.py --platform lepton ...`.\n3. For `s3:\u002F\u002F` datasets\u002Fresults, verify `ACCESS_KEY` and `SECRET_KEY` are set\n   and the exact paths are readable with `aws s3 ls`.\n4. For NFS\u002FLustre mounted paths, require proof from Lepton volume\u002Fstorage\n   permissions that the path will be mounted into the job. Do not treat a local\n   filesystem `test -e` on the agent host as proof for Lepton jobs.\n5. Verify model-specific credentials such as `HF_TOKEN` before launch.\n\n## Backend Details\n\n`LeptonSDK.create_job` accepts these Lepton-specific kwargs (in addition to the platform-agnostic ones — `image`, `command`, `gpu_count`, `env_vars`, `inputs`, `outputs`, `hooks`):\n\n- **`resource_shape`**: explicit GPU resource shape ID (e.g., `\"gpu.8xh100-sxm\"`). When set, skips the auto-resolution from `gpu_count`. The format is opaque (whatever Lepton's API returns as instance metadata.id) — discover valid IDs via `sdk.list_resource_shapes()`.\n- **`dedicated_node_group`**: node group ID for guaranteed GPU allocation (no preemption). Omit for shared resources.\n- **`num_nodes`**: number of nodes for distributed training. Default 1. When > 1, enables intra-job communication and PyTorch distributed initialization (see [Multi-node training](#multi-node-training-distributed)).\n- **`mounts`**: pre-built `Mount` objects for NFS \u002F Lustre. Auto-detected from the node group when not set.\n\n### Discovering the workspace's shapes \u002F volumes\n\n```python\nshapes = sdk.list_resource_shapes()\n# {\u003Cplatform_id>: {\"cluster\": ..., \"gpu_type\": \"gpu.8xh100-sxm\",\n#                   \"gpu_count\": 8, \"instance_type\": ..., ...}, ...}\n\nvolumes = sdk.get_volumes(node_group_id=\"my-h100-pool\")\n# [{\"name\": \"lustre\", \"from_path\": \"\u002Flustre\", \"type\": \"Lustre\"}, ...]\n\nprefixes = sdk.get_storage_permissions(\"lustre\", \"my-h100-pool\")\n# [\"\u002Flustre\u002Ffsw\u002Fportfolios\u002Fedgeai\u002F...\", ...]\n```\n\n## Multi-node training (distributed)\n\nPass `num_nodes > 1` to `create_job` for multi-node distributed training. The Lepton handler (`tao_sdk\u002Fplatforms\u002Flepton\u002Fhandler.py`) configures the underlying `LeptonJob` by setting `intra_job_communication=True` (opens pod-to-pod networking), `parallelism=num_nodes` and `completions=num_nodes` (Lepton schedules N replicas), and exports `WORLD_SIZE=num_nodes` as a container env var.\n\nLepton's native per-replica env vars use Lepton-specific names (`LEPTON_JOB_WORKER_INDEX`, `LEPTON_JOB_TOTAL_WORKERS`, `LEPTON_JOB_WORKER_PREFIX`, `LEPTON_SUBDOMAIN`), so the handler prepends a bootstrap that sources Lepton's official translation script:\n\n```bash\nwget -O init.sh https:\u002F\u002Fraw.githubusercontent.com\u002Fleptonai\u002Fscripts\u002Fmain\u002Flepton_env_to_pytorch.sh\nchmod +x init.sh\nsource init.sh\n# user command runs here\n```\n\nAfter sourcing, the following env vars are set:\n\n| Env var | Source | Value |\n|---|---|---|\n| `MASTER_ADDR` | script | `${LEPTON_JOB_WORKER_PREFIX}-0.${LEPTON_SUBDOMAIN}` |\n| `MASTER_PORT` | script | `29400` |\n| `NNODES` | script | `${LEPTON_JOB_TOTAL_WORKERS}` |\n| `NODE_RANK` | script | `${LEPTON_JOB_WORKER_INDEX}` |\n| `WORKER_ADDRS` | script | comma-separated list of non-master worker hostnames |\n| `WORLD_SIZE` | TAO SDK handler | `num_nodes` (TAO container's convention — same value as `NNODES`) |\n| `NUM_GPU_PER_NODE` | TAO SDK handler | `gpu_count` (read by TAO container's entrypoint) |\n\n```python\njob = sdk.create_job(\n    image='nvcr.io\u002Fnvidia\u002Ftao\u002Ftao-toolkit:6.26.3-pyt',\n    command='dino train -e \u002Ftmp\u002Fspec.yaml',  # TAO entrypoint reads WORLD_SIZE + NUM_GPU_PER_NODE\n    gpu_count=8,                          # GPUs per node\n    num_nodes=4,                          # 4 × 8 = 32 GPUs total\n    dedicated_node_group='my-h100-pool',\n    inputs={'\u002Fdata\u002Ftrain.json': 's3:\u002F\u002Fbucket\u002Fcoco\u002Ftrain.json'},\n    outputs=['\u002Fresults\u002F'],\n)\n```\n\nFor raw `torchrun`-based commands (non-TAO containers):\n\n```python\ncommand='torchrun --nnodes=$NNODES --nproc-per-node=8 --node-rank=$NODE_RANK '\n        '--master-addr=$MASTER_ADDR --master-port=$MASTER_PORT train.py'\n```\n\n### Two ways to run distributed jobs on Lepton\n\n| Path | When to use |\n|---|---|\n| **TAO SDK `create_job(num_nodes=N)`** (this skill) | Programmatic submission from agent code; you want the SDK's S3 wrapping, monitoring, failure analysis, and JobStore. |\n| **Lepton \"Torchrun\" job type** (Lepton UI \u002F lep CLI) | Hand-crafted submission via the Lepton console. Lepton's UI has a first-class \"Torchrun\" mode that wires up the rendezvous for you — no bootstrap script needed. See the [official example](https:\u002F\u002Fdocs.nvidia.com\u002Fdgx-cloud\u002Flepton\u002Fexamples\u002Fbatch-job\u002Fdistributed-training-with-pytorch\u002F). |\n\n### Reference reading\n\n- NVIDIA's Lepton multi-node PyTorch example (UI \u002F Torchrun mode): \u003Chttps:\u002F\u002Fdocs.nvidia.com\u002Fdgx-cloud\u002Flepton\u002Fexamples\u002Fbatch-job\u002Fdistributed-training-with-pytorch\u002F>\n- The translation script the SDK sources: \u003Chttps:\u002F\u002Fgithub.com\u002Fleptonai\u002Fscripts\u002Fblob\u002Fmain\u002Flepton_env_to_pytorch.sh>\n- PyTorch distributed (env-var rendezvous): \u003Chttps:\u002F\u002Fpytorch.org\u002Fdocs\u002Fstable\u002Felastic\u002Frun.html>\n- NCCL networking tuning: \u003Chttps:\u002F\u002Fdocs.nvidia.com\u002Fdeeplearning\u002Fnccl\u002Fuser-guide\u002Fdocs\u002Fenv.html>\n\n### Notes\n\n- Prefer `dedicated_node_group` for multi-node to keep replicas on the same low-latency interconnect (NVLink \u002F InfiniBand).\n- If a replica is preempted on a shared node group, the whole job fails — Lepton doesn't elastically restart in v1. Use a dedicated node group for long runs.\n- For Lustre-backed datasets, the same mount is exposed to every replica — no per-replica I\u002FO wrapping needed.\n\n## Cloud Storage\n\nEven though the platform is Lepton, the storage layer is S3-compatible. Always use `aws` as the `cloud_metadata` key and `s3:\u002F\u002F` as the URI protocol for both datasets and `results_dir`.\n\n- Correct: `s3:\u002F\u002Fbucket-name\u002Fpath`\n- Incorrect: `lepton:\u002F\u002Fbucket-name\u002Fpath`\n\nThe container's `get_cloud_storage_class_object()` parses the URI protocol to look up credentials in `CLOUD_METADATA[protocol][bucket]`.\n\n## Shared Storage (NFS\u002FLustre)\n\nNode groups can have NFS or Lustre volumes attached. The SDK auto-detects these and mounts them into containers for persistent cross-job data sharing.\n\n### SDK Functions\n\n- `sdk.get_volumes(node_group_id=None)` — returns available volumes (name, from_path, type) from node group spec\n- `sdk.get_storage_permissions(volume_name, node_group_id)` — returns allowed path prefixes for a volume\n\n`LeptonSDK.create_job()` calls these automatically to detect mounts and build the appropriate `Mount` objects for job specs.\n\n### How the script runner uses mounts\n\nWhen a Lustre mount is available:\n- **Inputs**: S3 paths are mapped to Lustre (`s3:\u002F\u002Fbucket\u002Fpath` → `\u002Fmnt\u002Flustre\u002Fbucket\u002Fpath`). If the file exists on Lustre, it's used directly (zero download). If missing, it's downloaded from S3 to Lustre and persists for future jobs.\n- **Outputs**: Results write to Lustre first (fast, persistent), then upload to S3 (durable). Downstream jobs (e.g., gap analysis) can read results directly from Lustre without an S3 round-trip.\n\n### Volume preference order\n\nlustre > filestore > first available\n\n### Lustre Cache Invalidation\n\nLustre caches files persistently across jobs. There is no built-in invalidation. If upstream data changes but the S3 path stays the same, Lustre serves the stale cached version. To force a cache miss:\n\n- **Rename the file** on S3 (e.g., `prompt_v2.txt` instead of overwriting `prompt.txt`)\n- **Use a new storage_root** between iterations to avoid cross-iteration staleness\n- **Use a new path** for any regenerated artifacts\n\n## Monitoring\n\n### Job Status\nUse `sdk.get_job_status(job_id)` for high-level status (Pending, Running, Complete, Error).\n\n### Replica Status\nUse `sdk.get_job_replicas(job_id)` during startup for detailed replica-level info. Each replica is a dict:\n\n```python\nreplicas = sdk.get_job_replicas(job_id)\nfor r in replicas:\n    node = r[\"status\"][\"node\"][\"name\"]           # e.g., \"node-ip-10-50-111-24\"\n    node_group = r[\"status\"][\"node\"][\"node_group_id\"]\n    cpu = r[\"status\"][\"cpu\"]                      # e.g., 2\n    memory_mb = r[\"status\"][\"memory_in_mb\"]       # e.g., 8192\n    readiness = r[\"status\"].get(\"readiness_issue\")\n    if readiness:\n        reason = readiness[\"reason\"]   # \"InProgress\", \"Failed\", \"ConfigError\"\n        message = readiness[\"message\"] # \"Pulling image\", \"Mount point not found\", etc.\n```\n\nKey readiness_issue patterns:\n- `reason=\"InProgress\"`, `message=\"Pulling image\"` — image pull in progress (normal for large images)\n- `reason=\"Failed\"` — image pull failed (check NGC_KEY)\n- `reason=\"ConfigError\"` — node issue (mount failure, GPU error)\n- No `readiness_issue` — replica is running\n\nReplica status is especially useful when a job is stuck in Pending — it reveals whether the issue is image pulling, resource scheduling, or node health.\n\n### Job Logs\nUse `sdk.get_job_logs(job_id, tail=N)` for the most recent N log lines. Logs are fetched from Lepton's log collection service.\n\n### Parallel Jobs\nFor workflow stages that run in parallel (e.g., video generation x8):\n\n1. **Launch:** Call `execute_step(plan, step_id, extra_args={\"split_id\": i})` for each split. Each call returns immediately with a job_id.\n2. **Monitor:** Poll all jobs: `sdk.get_job_status(job_id)` for each. Use `get_job_replicas(job_id)` for startup diagnostics.\n3. **Completion:** All jobs done when every status is `Complete` or `Error`.\n4. **Partial failure:** Retry only failed splits — successful splits don't need re-running. Pass the same `split_id` to `execute_step`.\n\n## Failure Analysis\n\nWhen a job fails, use `sdk.get_failure_analysis(job_id)` for automatic root cause detection:\n\n```python\nanalysis = sdk.get_failure_analysis(job_id)\nif analysis:\n    print(analysis[\"err_class\"])    # e.g., \"ERR_PROGRAM\"\n    print(analysis[\"suggestion\"])   # Human-readable fix\n    for event in analysis.get(\"job_failure_by_node_event\", []):\n        print(event[\"node_event_name\"], event[\"message\"])\n        # e.g., \"OOM\", \"OOM encountered, victim process: cosmos-rl-evalu, pid: 3368483\"\n```\n\nReturns:\n- `err_class`: Error classification (`ERR_PROGRAM`, `ERR_INFRA`, etc.)\n- `suggestion`: What likely went wrong and how to fix it\n- `job_failure_by_node_event`: Node-level events (OOM kills, GPU errors, mount failures)\n- `log_streams`: Relevant log snippets with error context\n\nAlways call this on failed jobs before retrying — it distinguishes user errors (bad config, OOM) from infrastructure issues (node failure, eviction).\n\n## Failure Modes\n\n**OOM killed**: Container exceeded GPU or system memory. Detection: `get_failure_analysis()` returns `node_event_name: \"OOM\"`. Common causes: `evaluation.batch_size` too high, `max_length` too large for available KV cache. Recovery: reduce batch_size, add GPUs with tensor parallelism, or reduce max_length.\n\n**Image pull failure**: The TAO container image cannot be pulled from nvcr.io. Usually caused by a missing or expired image pull secret. The SDK auto-provisions the secret from NGC_KEY, but if NGC_KEY is invalid, the job will fail. Detection: check `get_job_replicas()` — `readiness_issue.reason` will show `InProgress` with `message = \"Pulling image\"` for extended periods, or `Failed` if the pull fails. Recovery: verify NGC_KEY is valid.\n\n**Resource unavailable**: The requested GPU shape is not available. Job enters Queueing state indefinitely. Detection: Pending > 15 minutes, replicas show no node assignment. Recovery: try a different resource_shape or dedicated_node_group, or wait for resources.\n\n**Auth failure**: Invalid or expired LEPTON_AUTH_TOKEN. All API calls fail with 401\u002F403. Detection: job creation raises an exception immediately. Recovery: refresh the token and reinitialize the SDK.\n\n**Unhealthy node**: The assigned node has infrastructure issues (mount failures, GPU errors, network problems). Detection: check `get_job_replicas()` — `readiness_issue.reason = \"ConfigError\"` with messages like `\"Mount point not found\"`. The job stays Pending indefinitely on the bad node. Recovery: cancel the job and resubmit — Lepton will schedule on a different node. If the issue recurs, try a different `dedicated_node_group` or `resource_shape`.\n\n**Job eviction**: On shared node groups, Lepton may evict jobs under resource pressure. Detection: job unexpectedly transitions from Running to Error. Recovery: retry, or use a dedicated_node_group.\n",{"name":5,"tags":44,"license":15,"metadata":47,"description":7,"allowed-tools":50,"compatibility":51},[24,45,46,20],"gpu","compute",{"author":48,"version":49},"NVIDIA Corporation","0.1.0","Read Bash","Requires the tao-sdk Python package with the lepton extra (pip install 'tao-sdk[lepton]') plus LEPTON_WORKSPACE_ID and LEPTON_AUTH_TOKEN.","main","7a940b8e5af16c95e5c190a524421d32fc7445a9",".claude\u002Fskills\u002Ftao-run-on-lepton","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui","https:\u002F\u002Fneuroads.com.br","2026-08-12 00:42:44",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add headmktlucca-ui\u002Fneuroads-lp --skill tao-run-on-lepton",{"tool":65,"command":66},"bunx","bunx skills add headmktlucca-ui\u002Fneuroads-lp --skill tao-run-on-lepton",{"tool":68,"command":69},"pnpm","pnpm dlx skills add headmktlucca-ui\u002Fneuroads-lp --skill tao-run-on-lepton","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftao-run-on-lepton\u002FSKILL.md",true,[73,79,85,89,93,97],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"BENCHMARK.md","REFERENCE","参考文档",4292,"https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftao-run-on-lepton\u002FBENCHMARK.md",{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"eval.config","OTHER","其他",4614,"https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftao-run-on-lepton\u002Feval.config",{"path":86,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":87,"sourceHtmlUrl":88},"evals\u002Fevals.json",769,"https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftao-run-on-lepton\u002Fevals\u002Fevals.json",{"path":90,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fskill_info.yaml",593,"https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftao-run-on-lepton\u002Freferences\u002Fskill_info.yaml",{"path":94,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":95,"sourceHtmlUrl":96},"skill-card.md",4295,"https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftao-run-on-lepton\u002Fskill-card.md",{"path":98,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":99,"sourceHtmlUrl":100},"skill.oms.sig",5045,"https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ftao-run-on-lepton\u002Fskill.oms.sig",[102,129,154,180,198,232],{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":106,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":117,"publishedAt":39},"01M6PTDCZTXTGSTX4RFK901YSZ","xunit-skill","Generates xUnit.net tests in C#. Covers Fact\u002FTheory, constructor injection, IClassFixture, and FluentAssertions. Use when user mentions \"xUnit\", \"[Fact]\", \"[Theory]\", \"Assert.Equal\", \"C# xUnit\". Triggers on: \"xUnit\", \"[Fact]\", \"[Theory]\", \"Assert.Equal C#\", \"xUnit.net\".","MIT","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fxunit-skill\u002FSKILL.md",[109,114],{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":115,"categoryName":116,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000023","Skill与智能体开发",[118,119,120,121,122,123,124,125,126,127,128],"xunit","xunit skill","testing","injection","user","use","tests","triggers","unit","unit-testing","C#",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":106,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":137,"publishedAt":39},"01M6PTCB59ZTG5FTMWGPYEMMBP","xcuitest-skill","Generates XCUITest UI tests for iOS\u002FiPadOS apps in Swift. Apple's native testing framework for reliable, fast UI automation. Supports local simulators and TestMu AI cloud real devices. Use when user mentions \"XCUITest\", \"XCTest\", \"iOS UI test\", \"Swift test\", \"XCUIApplication\". Triggers on: \"XCUITest\", \"XCTest UI\", \"iOS UI test\", \"Swift UI test\", \"XCUIApplication\", \"TestMu\".","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fxcuitest-skill\u002FSKILL.md",[135,136],{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},{"categoryNo":115,"categoryName":116,"taxonomyType":112,"taxonomyTypeDesc":113},[138,139,120,140,141,142,143,144,123,145,146,147,148,149,124,125,150,151,152,153],"xcuitest","xcuitest skill","automation","test","testing framework","ios","devices","mobile","mobile-testing","ui test","local","apple","apps","native","for","objective",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":106,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":164,"publishedAt":39},"01M6PTATMNTY9NF4J7KSR76YK6","world-builder","Create and manage generative game zones for Dorothy's Pokemon-style world. Use this skill when creating, updating, or designing game worlds via MCP tools.","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fworld-builder\u002FSKILL.md",[160,163],{"categoryNo":161,"categoryName":162,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":115,"categoryName":116,"taxonomyType":112,"taxonomyTypeDesc":113},[165,166,167,168,169,170,171,172,123,173,174,175,176,177,178,152,179],"builder","world","world builder","MCP","create","mcp tools","Tools","game","pokemon","manage","style","via","theme","zone","generative",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":106,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":188,"publishedAt":39},"01M6PT9Z92JTSQEHE1QR0NNW5F","webdriverio-skill","Generates WebdriverIO (WDIO) automation tests in JavaScript or TypeScript. Supports local and TestMu AI cloud. Use when user mentions \"WebdriverIO\", \"WDIO\", \"wdio.conf\", \"browser.url\", \"$\", \"$$\". Triggers on: \"WebdriverIO\", \"WDIO\", \"wdio\", \"browser.$\".","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwebdriverio-skill\u002FSKILL.md",[186,187],{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},{"categoryNo":115,"categoryName":116,"taxonomyType":112,"taxonomyTypeDesc":113},[189,120,190,140,191,192,193,194,122,123,195,148,124,125,196,197],"webdriverio skill","typescript","javascript","browser","cloud","e2e","e2e-testing","URL","conf",{"skillNo":199,"name":200,"nameZh":6,"description":201,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":106,"licenseFileUrl":6,"sourceHtmlUrl":202,"categories":203,"keywords":213,"publishedAt":39},"01M6PT9NVK36ZWCQ69YXK3FR4K","web-design-guidelines","Web platform design and accessibility guidelines. Use when building web interfaces, auditing accessibility, implementing responsive layouts, or reviewing web UI code. Triggers on tasks involving HTML, CSS, web components, WCAG compliance, responsive design, or web performance.","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fweb\u002FSKILL.md",[204,207,208],{"categoryNo":205,"categoryName":206,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":161,"categoryName":162,"taxonomyType":112,"taxonomyTypeDesc":113},{"categoryNo":209,"categoryName":210,"taxonomyType":211,"taxonomyTypeDesc":212},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,29,125,231],"design","web","guidelines","web design guidelines","web design","css","performance","components","web components","tasks","code","web performance","ui","platform design","html","responsive design","responsive","implementing",{"skillNo":233,"name":234,"nameZh":6,"description":235,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":106,"licenseFileUrl":6,"sourceHtmlUrl":236,"categories":237,"keywords":240,"publishedAt":39},"01M6PT9A3JKRE3X34276F2FW5R","watchos-design-guidelines","Apple Human Interface Guidelines for Apple Watch. Use when building watchOS apps, complications, or workout features. Triggers on tasks involving Watch UI, Digital Crown, glanceable interfaces, or wrist-based interactions.","https:\u002F\u002Fgithub.com\u002Fheadmktlucca-ui\u002Fneuroads-lp\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwatchos\u002FSKILL.md",[238,239],{"categoryNo":161,"categoryName":162,"taxonomyType":112,"taxonomyTypeDesc":113},{"categoryNo":209,"categoryName":210,"taxonomyType":211,"taxonomyTypeDesc":212},[214,216,241,223,226,123,242,243,149,29,244,125,150,26,152,245,246],"watchos design guidelines","workout","human","watch","platform-design","features"]