[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71MYKWT63NERP19DBMYF6AW":3,"skill-same:01M71MYKWT63NERP19DBMYF6AW":155},{"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":56,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M71MYKWT63NERP19DBMYF6AW","earth2studio-create-diagnostic",null,"Create Earth2Studio diagnostic model wrappers for single-step data transformations, including simple derived diagnostics, packaged AutoModel diagnostics, and generative or diffusion diagnostics. Do NOT use for prognostic time-stepping models, data sources, or installation.","pattanation\u002FNorvik","pattanation","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F235419268?v=4","01M71M5THHYYB15ME8R2E4FCZG","Patta","01M71M5TJM1NDM992M8PDKYR2K",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"create","diagnostic","earth2studio create diagnostic","agent-skills","python","for","single-step","NVIDIA","do","path","diagnostics","data","data sources","team","URL","local","time","model","generative","sources","2026-11-10 10:56:23",false,"---\nname: earth2studio-create-diagnostic\nversion: 0.16.0\nlicense: Apache-2.0\nmetadata:\n  author: NVIDIA Earth-2 Team \u003Cagent-skills@nvidia.com>\n  tags: [earth2studio, diagnostic-model, python]\ndescription: >\n  Create Earth2Studio diagnostic model wrappers for single-step data\n  transformations, including simple derived diagnostics, packaged AutoModel\n  diagnostics, and generative or diffusion diagnostics. Do NOT use for\n  prognostic time-stepping models, data sources, or installation.\nargument-hint: URL or local path to reference inference script (optional)\n---\n\n## Quick Start Checklist\n\nDo these steps in order. Do not skip ahead. Before editing, read this\nSKILL.md and load the relevant reference files for the model type. After\nimplementation, run the focused pytest command before saying tests pass. If\ntests cannot run, report the exact command and failure instead of claiming\nsuccess.\n\n- [ ] Read this SKILL.md completely first\n- [ ] Get the reference script, repo, paper, or model documentation (Step 0)\n- [ ] Classify the diagnostic as simple, AutoModel, or generative (Step 1)\n- [ ] Propose dependency extras before editing dependency files (Step 1)\n- [ ] Create `earth2studio\u002Fmodels\u002Fdx\u002F\u003Cname>.py` with diagnostic-only APIs\n- [ ] Create `test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py` with mock tests\n- [ ] Run: `uv run pytest test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py -m \"not package\" -v`\n- [ ] Add\u002Fupdate model extra, install docs, API docs, and changelog when required\n- [ ] Run: `make format && make lint && make license`\n\nCritical command rule: always use `uv run` for Python commands:\n\n- Use `uv run pytest ...` and `uv run python ...`\n- Do not use bare `pytest` or `python` in repo workflows\n\nIf the generated model is wrong, do not keep retrying the same fix. Follow\n[Self-Improvement](#self-improvement), patch this skill or its references, then\ncontinue with the corrected workflow.\n\n## Purpose\n\nImplement a diagnostic model wrapper connecting third-party or derived ML\ntransforms to Earth2Studio. Diagnostic models transform data at a single time\npoint: input fields in, output fields out, no forecast integration.\n\n## Prerequisites\n\n- Earth2Studio installed via `uv` with dev dependencies (`uv sync --all-extras`)\n- Python 3.10+ environment\n- Reference inference script, repo, paper, or model documentation\n- Checkpoint source and license information for packaged models\n\n## Limitations\n\n- Handles single-step transformations only\n- Does not support time-stepping forecast models; use `earth2studio-create-prognostic`\n- Real package tests can require network access to NGC, HuggingFace, S3, or other registries\n- Generative validation can require GPU and fixed seeds for meaningful comparison\n\n## Diagnostic Model Types\n\n| Type | Inheritance | Dependency extra | Example |\n|------|-------------|------------------|---------|\n| Simple derived diagnostic | `torch.nn.Module` only | Usually none | `Identity`, wind speed |\n| Packaged AutoModel diagnostic | `torch.nn.Module, AutoModelMixin` | Required, even if empty | `PrecipitationAFNO` |\n| Generative diagnostic | `torch.nn.Module, AutoModelMixin` | Required, even if empty | `CorrDiff` |\n\n## Workspace\n\n| Context | Location |\n|---------|----------|\n| Harbor eval | Write to `\u002Fworkspace\u002Foutput\u002Fearth2studio\u002Fmodels\u002Fdx\u002F...` |\n| Harbor + `--copy-repo` | Full checkout at `\u002Fworkspace\u002Frepo` |\n| Local clone | Directory with `pyproject.toml` |\n\nNever read `evals\u002Ftargets\u002F`; those files are grader references only.\n\n### Reference Files\n\nLoad these files on demand during the matching workflow:\n\n| File | Content | Load at |\n|------|---------|---------|\n| `references\u002Fskeleton-template.py` | Full diagnostic skeletons for simple, AutoModel, and generative wrappers | Steps 3-6 |\n| `references\u002Fmethod-templates.py` | Focused coordinate, loading, forward, and device method snippets | Steps 4-6 |\n| `references\u002Ftesting-guide.py` | Mock, package, exception, sample, and seed test patterns | Step 7 |\n| `references\u002Fvalidation-guide.md` | Reference comparison, plots, PR hygiene, and review follow-up | Steps 10-11 |\n| `references\u002Fpr-body-template.md` | PR body template | Step 11 |\n| `references\u002Fpr-comment-template.md` | Validation comment template | Step 11 |\n\n## Instructions\n\n### Step 0 - Get Reference Material\n\nIf `$ARGUMENTS` provides a URL or local path, use it. Otherwise ask:\n\n> Please provide a reference inference script, repository, paper, or model documentation.\n\nCapture the reference model's input variables, output variables, tensor shapes,\nnormalization, grid, checkpoint source, dependency requirements, and license.\n\n### Step 1 - Analyze Type and Propose Dependencies\n\nClassify the requested diagnostic before editing files:\n\n| If the model... | Then use... |\n|-----------------|-------------|\n| Computes a derived quantity with no checkpoint | Simple diagnostic |\n| Loads weights from `Package` or an external checkpoint | AutoModel diagnostic |\n| Produces multiple samples, diffusion outputs, VAE samples, or stochastic super-resolution | Generative diagnostic |\n\nDependency policy:\n\n- Simple derived diagnostics usually do not need a `pyproject.toml` extra.\n- AutoModel and generative diagnostics must have a named optional dependency extra, even if the list is empty.\n- Add the extra alphabetically under `[project.optional-dependencies]` and include it in the `all` aggregate.\n- Use the model-extra name in `OptionalDependencyFailure(\"model-extra\")` and `@check_optional_dependencies()`.\n\nPresent the proposed dependency extra and ask the user to approve before editing\n`pyproject.toml`:\n\n```toml\nmodel-name = [\"package1>=version\", \"package2\"]\n# or, when the packaged diagnostic needs no extra runtime packages:\nmodel-name = []\n```\n\n### Step 2 - Add Dependencies\n\nAfter approval, edit `pyproject.toml`:\n\n- Add the extra alphabetically.\n- Update the `all` aggregate.\n- Prefer minimum supported versions from the reference package documentation.\n- Do not add broad unpinned Git dependencies unless the reference model requires them and the user approves.\n\n### Step 3 - Create Model File\n\nFile: `earth2studio\u002Fmodels\u002Fdx\u002F\u003Clowercase>.py`\n\nUse the repo-standard SPDX\u002Flicense header shown in existing model files.\n\nSimple diagnostic imports commonly include:\n\n```python\nfrom collections import OrderedDict\nimport numpy as np\nimport torch\nfrom earth2studio.models.batch import batch_coords, batch_func\nfrom earth2studio.utils import handshake_coords, handshake_dim\nfrom earth2studio.utils.type import CoordSystem\n```\n\nPackaged and generative diagnostics commonly also include:\n\n```python\nfrom earth2studio.models.auto import AutoModelMixin, Package\nfrom earth2studio.models.dx.base import DiagnosticModel\nfrom earth2studio.utils.imports import OptionalDependencyFailure, check_optional_dependencies\nfrom loguru import logger\n```\n\nCanonical method order:\n\n1. `__init__`\n2. `input_coords`\n3. `output_coords` decorated with `@batch_coords()`\n4. `__str__` if useful\n5. `load_default_package` for AutoModel\u002Fgenerative diagnostics\n6. `load_model` for AutoModel\u002Fgenerative diagnostics\n7. `to` only when non-PyTorch state must move devices\n8. Private\u002Fsupport methods\n9. `__call__` decorated with `@torch.inference_mode()` and `@batch_func()`\n\nAvoid shared base classes or broad abstractions unless the wrapper naturally has\nmultiple closely related variants where a small base class reduces duplication.\n\n### Step 4 - Implement Coordinates\n\nDiagnostic input coordinates usually use this public Earth2Studio order:\n\n1. `batch`: `np.empty(0)` and first in the `OrderedDict`\n2. `variable`: input variable names using Earth2Studio vocabulary names\n3. `lat`: public latitude convention north-to-south, usually `90` to `-90`\n4. `lon`: public longitude convention `0` to `360`, endpoint normally false\n\nNo diagnostic wrapper should expose `lead_time`. If a diagnostic needs validity\ntime metadata, document it as per-sample metadata in `coords[\"time\"]`; do not make\nit a tensor dimension unless an existing dx pattern requires it.\n\n`output_coords` must validate inputs with `handshake_dim` and `handshake_coords`.\nThen update output variables and, when needed, output lat\u002Flon resolution.\nGenerative diagnostics must add a `sample` dimension after `batch`.\n\n### Step 5 - Implement Forward Pass\n\nUse a single-step `__call__`; never create an iterator. Validate coordinates\nbefore model execution, then return `(output_tensor, output_coords)`.\n\n```python\n@torch.inference_mode()\n@batch_func()\ndef __call__(self, x: torch.Tensor, coords: CoordSystem) -> tuple[torch.Tensor, CoordSystem]:\n    output_coords = self.output_coords(coords)\n    x = (x - self.center) \u002F self.scale\n    out = self.core_model(x)\n    return out, output_coords\n```\n\nFor generative diagnostics, loop over the batch dimension and generate\n`number_of_samples` per input item. Use explicit seeds for reproducibility when\nthe reference implementation supports seeded sampling.\n\n### Step 6 - Implement Model Loading\n\nFor packaged diagnostics:\n\n- `load_default_package` should lock HuggingFace URLs to a commit (`hf:\u002F\u002Forg\u002Frepo@commit`) or NGC\u002FS3 versions to an immutable release.\n- `load_model` should call `package.resolve(...)`, load checkpoints on CPU first, set modules to `eval()`, and disable gradients where appropriate.\n- Use `weights_only=False` only when loading a pickled full PyTorch object is required.\n- Decorate optional model classes and `load_model` with `@check_optional_dependencies()`.\n- Use `loguru.logger` for useful loading messages; do not use `print()` inside `earth2studio\u002F`.\n\n### Step 7 - Write Tests\n\nFile: `test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py`\n\nRequired tests:\n\n| Function | Purpose |\n|----------|---------|\n| `test_\u003Cmodel>_call` | Forward pass with mock or simple model |\n| `test_\u003Cmodel>_exceptions` | Invalid coordinate order, values, or variables raise errors |\n| `test_\u003Cmodel>_package` | Real weights with `@pytest.mark.package` for AutoModel\u002Fgenerative diagnostics |\n\nGenerative diagnostics also require sample-count and deterministic-seed tests.\nUse `references\u002Ftesting-guide.py`. Create a `Phoo\u003CModelName>` dummy that matches\nthe real core model's interface and produces deterministic output.\n\nRun focused tests:\n\n```bash\nuv run pytest test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py -m \"not package\" -v\nuv run pytest test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py::test_\u003Cmodel>_package --package -v\n```\n\nDo not omit package tests for packaged models. If arbitrary random inputs are not\nphysically valid for the real checkpoint, build a stable model-appropriate input\nwhile still loading real weights and running a forward pass.\n\n### Step 8 - Register Model\n\nFor public models, update `earth2studio\u002Fmodels\u002Fdx\u002F__init__.py` alphabetically.\nSkip registration only when the user explicitly wants an internal or experimental\nfile that should not be exported.\n\n### Step 9 - Documentation\n\nFor public models:\n\n- Add to `docs\u002Fmodules\u002Fmodels_dx.rst` alphabetically so API docs include the generated page.\n- Add to `docs\u002Fuserguide\u002Fabout\u002Finstall.md` if a model extra exists. Include model notes plus both `pip install earth2studio[model-name]` and `uv add earth2studio --extra model-name` instructions.\n- Update `CHANGELOG.md` under `### Added`.\n\nFormat and lint:\n\n```bash\nmake format && make lint && make license\n```\n\n### Step 10 - Validation (if requested)\n\nFollow `references\u002Fvalidation-guide.md`. Create uncommitted vanilla,\nEarth2Studio, comparison, and sanity-check scripts. Do not commit generated\noutputs, checkpoints, images, or local validation scripts.\n\nFor generative diagnostics, fix seeds and compare matching samples or report\nstatistical\u002Ftolerance-based agreement when exact equality is impossible.\nAsk the user to visually inspect plots before proceeding.\n\n### Step 11 - PR (if requested)\n\nFollow `references\u002Fvalidation-guide.md` and use:\n\n- `references\u002Fpr-body-template.md`\n- `references\u002Fpr-comment-template.md`\n\nBefore creating the PR, verify dependency extras, `all`, install docs, API docs,\nchangelog, tests, and validation artifacts are consistent. Do not include machine\nnames, hostnames, absolute paths, cache paths, device inventory, or uploaded image\nlinks in PR text. Use plot placeholders for manual image upload.\n\n## Examples\n\n### Simple Diagnostic\n\n```text\nUser: Create a diagnostic that computes wind speed from u10m and v10m.\nAgent: Reads SKILL.md, classifies as simple, creates windspeed.py with only\n       torch.nn.Module, writes call and exception tests, runs focused pytest.\n```\n\n### AutoModel Diagnostic\n\n```text\nUser: Add a precipitation estimator from this reference script.\nAgent: Reads SKILL.md and references, proposes dependency extra, creates a\n       torch.nn.Module + AutoModelMixin wrapper, writes mock\u002Fpackage tests,\n       updates docs\u002Fchangelog\u002Fdependencies, and runs validation commands.\n```\n\n### Generative Diagnostic\n\n```text\nUser: Wrap this diffusion super-resolution model.\nAgent: Classifies as generative, adds sample output coordinates, supports seed\n       handling, writes sample and deterministic-seed tests, and prepares seeded\n       validation comparisons.\n```\n\n## Troubleshooting\n\n| Error | Solution |\n|-------|----------|\n| `OptionalDependencyFailure` | Install with `uv sync --extra \u003Cmodel-extra>` or fix the extra name |\n| Coordinate handshake fails | Check `OrderedDict` order and `handshake_dim` indices |\n| Wrong output shape | Verify `output_coords` lengths match returned tensor shape |\n| `ModuleNotFoundError: pytest` | Use `uv run pytest`, not bare `pytest` |\n| Package test fails on random input | Use a stable physically plausible input while still loading real weights |\n\n## Reminders\n\nDo:\n\n- Use `uv run python` and `uv run pytest` for all Python commands.\n- Use `@batch_coords()` on `output_coords`.\n- Use `@torch.inference_mode()` and `@batch_func()` on `__call__`.\n- Keep `batch` as the first coordinate with `np.empty(0)` in `input_coords`.\n- Validate coordinates with `handshake_dim()` and `handshake_coords()`.\n- Add `sample` in generative `output_coords`.\n- Include the repo-standard SPDX\u002Flicense header in every Python file.\n- Use `loguru.logger`, never `print()`, inside `earth2studio\u002F`.\n\nDo not:\n\n- Inherit from `PrognosticMixin`.\n- Include `lead_time` coordinates.\n- Create `create_iterator`.\n- Create general base classes for a single wrapper without a clear multi-variant need.\n- Commit API keys, credentials, validation scripts, plots, or generated outputs.\n- Read from `evals\u002Ftargets\u002F`.\n\n## Self-Improvement\n\nIf this skill produces incorrect outputs, update it before continuing:\n\n1. Identify the issue in the generated code or workflow.\n2. Edit `SKILL.md` or the relevant file in `references\u002F` to fix the guidance.\n3. Run focused validation for the changed skill files.\n4. Commit the skill fix separately when working in a branch that expects commits.\n5. Continue the model implementation with the corrected workflow.\n","## Quick Start Checklist\n\nDo these steps in order. Do not skip ahead. Before editing, read this\nSKILL.md and load the relevant reference files for the model type. After\nimplementation, run the focused pytest command before saying tests pass. If\ntests cannot run, report the exact command and failure instead of claiming\nsuccess.\n\n- [ ] Read this SKILL.md completely first\n- [ ] Get the reference script, repo, paper, or model documentation (Step 0)\n- [ ] Classify the diagnostic as simple, AutoModel, or generative (Step 1)\n- [ ] Propose dependency extras before editing dependency files (Step 1)\n- [ ] Create `earth2studio\u002Fmodels\u002Fdx\u002F\u003Cname>.py` with diagnostic-only APIs\n- [ ] Create `test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py` with mock tests\n- [ ] Run: `uv run pytest test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py -m \"not package\" -v`\n- [ ] Add\u002Fupdate model extra, install docs, API docs, and changelog when required\n- [ ] Run: `make format && make lint && make license`\n\nCritical command rule: always use `uv run` for Python commands:\n\n- Use `uv run pytest ...` and `uv run python ...`\n- Do not use bare `pytest` or `python` in repo workflows\n\nIf the generated model is wrong, do not keep retrying the same fix. Follow\n[Self-Improvement](#self-improvement), patch this skill or its references, then\ncontinue with the corrected workflow.\n\n## Purpose\n\nImplement a diagnostic model wrapper connecting third-party or derived ML\ntransforms to Earth2Studio. Diagnostic models transform data at a single time\npoint: input fields in, output fields out, no forecast integration.\n\n## Prerequisites\n\n- Earth2Studio installed via `uv` with dev dependencies (`uv sync --all-extras`)\n- Python 3.10+ environment\n- Reference inference script, repo, paper, or model documentation\n- Checkpoint source and license information for packaged models\n\n## Limitations\n\n- Handles single-step transformations only\n- Does not support time-stepping forecast models; use `earth2studio-create-prognostic`\n- Real package tests can require network access to NGC, HuggingFace, S3, or other registries\n- Generative validation can require GPU and fixed seeds for meaningful comparison\n\n## Diagnostic Model Types\n\n| Type | Inheritance | Dependency extra | Example |\n|------|-------------|------------------|---------|\n| Simple derived diagnostic | `torch.nn.Module` only | Usually none | `Identity`, wind speed |\n| Packaged AutoModel diagnostic | `torch.nn.Module, AutoModelMixin` | Required, even if empty | `PrecipitationAFNO` |\n| Generative diagnostic | `torch.nn.Module, AutoModelMixin` | Required, even if empty | `CorrDiff` |\n\n## Workspace\n\n| Context | Location |\n|---------|----------|\n| Harbor eval | Write to `\u002Fworkspace\u002Foutput\u002Fearth2studio\u002Fmodels\u002Fdx\u002F...` |\n| Harbor + `--copy-repo` | Full checkout at `\u002Fworkspace\u002Frepo` |\n| Local clone | Directory with `pyproject.toml` |\n\nNever read `evals\u002Ftargets\u002F`; those files are grader references only.\n\n### Reference Files\n\nLoad these files on demand during the matching workflow:\n\n| File | Content | Load at |\n|------|---------|---------|\n| `references\u002Fskeleton-template.py` | Full diagnostic skeletons for simple, AutoModel, and generative wrappers | Steps 3-6 |\n| `references\u002Fmethod-templates.py` | Focused coordinate, loading, forward, and device method snippets | Steps 4-6 |\n| `references\u002Ftesting-guide.py` | Mock, package, exception, sample, and seed test patterns | Step 7 |\n| `references\u002Fvalidation-guide.md` | Reference comparison, plots, PR hygiene, and review follow-up | Steps 10-11 |\n| `references\u002Fpr-body-template.md` | PR body template | Step 11 |\n| `references\u002Fpr-comment-template.md` | Validation comment template | Step 11 |\n\n## Instructions\n\n### Step 0 - Get Reference Material\n\nIf `$ARGUMENTS` provides a URL or local path, use it. Otherwise ask:\n\n> Please provide a reference inference script, repository, paper, or model documentation.\n\nCapture the reference model's input variables, output variables, tensor shapes,\nnormalization, grid, checkpoint source, dependency requirements, and license.\n\n### Step 1 - Analyze Type and Propose Dependencies\n\nClassify the requested diagnostic before editing files:\n\n| If the model... | Then use... |\n|-----------------|-------------|\n| Computes a derived quantity with no checkpoint | Simple diagnostic |\n| Loads weights from `Package` or an external checkpoint | AutoModel diagnostic |\n| Produces multiple samples, diffusion outputs, VAE samples, or stochastic super-resolution | Generative diagnostic |\n\nDependency policy:\n\n- Simple derived diagnostics usually do not need a `pyproject.toml` extra.\n- AutoModel and generative diagnostics must have a named optional dependency extra, even if the list is empty.\n- Add the extra alphabetically under `[project.optional-dependencies]` and include it in the `all` aggregate.\n- Use the model-extra name in `OptionalDependencyFailure(\"model-extra\")` and `@check_optional_dependencies()`.\n\nPresent the proposed dependency extra and ask the user to approve before editing\n`pyproject.toml`:\n\n```toml\nmodel-name = [\"package1>=version\", \"package2\"]\n# or, when the packaged diagnostic needs no extra runtime packages:\nmodel-name = []\n```\n\n### Step 2 - Add Dependencies\n\nAfter approval, edit `pyproject.toml`:\n\n- Add the extra alphabetically.\n- Update the `all` aggregate.\n- Prefer minimum supported versions from the reference package documentation.\n- Do not add broad unpinned Git dependencies unless the reference model requires them and the user approves.\n\n### Step 3 - Create Model File\n\nFile: `earth2studio\u002Fmodels\u002Fdx\u002F\u003Clowercase>.py`\n\nUse the repo-standard SPDX\u002Flicense header shown in existing model files.\n\nSimple diagnostic imports commonly include:\n\n```python\nfrom collections import OrderedDict\nimport numpy as np\nimport torch\nfrom earth2studio.models.batch import batch_coords, batch_func\nfrom earth2studio.utils import handshake_coords, handshake_dim\nfrom earth2studio.utils.type import CoordSystem\n```\n\nPackaged and generative diagnostics commonly also include:\n\n```python\nfrom earth2studio.models.auto import AutoModelMixin, Package\nfrom earth2studio.models.dx.base import DiagnosticModel\nfrom earth2studio.utils.imports import OptionalDependencyFailure, check_optional_dependencies\nfrom loguru import logger\n```\n\nCanonical method order:\n\n1. `__init__`\n2. `input_coords`\n3. `output_coords` decorated with `@batch_coords()`\n4. `__str__` if useful\n5. `load_default_package` for AutoModel\u002Fgenerative diagnostics\n6. `load_model` for AutoModel\u002Fgenerative diagnostics\n7. `to` only when non-PyTorch state must move devices\n8. Private\u002Fsupport methods\n9. `__call__` decorated with `@torch.inference_mode()` and `@batch_func()`\n\nAvoid shared base classes or broad abstractions unless the wrapper naturally has\nmultiple closely related variants where a small base class reduces duplication.\n\n### Step 4 - Implement Coordinates\n\nDiagnostic input coordinates usually use this public Earth2Studio order:\n\n1. `batch`: `np.empty(0)` and first in the `OrderedDict`\n2. `variable`: input variable names using Earth2Studio vocabulary names\n3. `lat`: public latitude convention north-to-south, usually `90` to `-90`\n4. `lon`: public longitude convention `0` to `360`, endpoint normally false\n\nNo diagnostic wrapper should expose `lead_time`. If a diagnostic needs validity\ntime metadata, document it as per-sample metadata in `coords[\"time\"]`; do not make\nit a tensor dimension unless an existing dx pattern requires it.\n\n`output_coords` must validate inputs with `handshake_dim` and `handshake_coords`.\nThen update output variables and, when needed, output lat\u002Flon resolution.\nGenerative diagnostics must add a `sample` dimension after `batch`.\n\n### Step 5 - Implement Forward Pass\n\nUse a single-step `__call__`; never create an iterator. Validate coordinates\nbefore model execution, then return `(output_tensor, output_coords)`.\n\n```python\n@torch.inference_mode()\n@batch_func()\ndef __call__(self, x: torch.Tensor, coords: CoordSystem) -> tuple[torch.Tensor, CoordSystem]:\n    output_coords = self.output_coords(coords)\n    x = (x - self.center) \u002F self.scale\n    out = self.core_model(x)\n    return out, output_coords\n```\n\nFor generative diagnostics, loop over the batch dimension and generate\n`number_of_samples` per input item. Use explicit seeds for reproducibility when\nthe reference implementation supports seeded sampling.\n\n### Step 6 - Implement Model Loading\n\nFor packaged diagnostics:\n\n- `load_default_package` should lock HuggingFace URLs to a commit (`hf:\u002F\u002Forg\u002Frepo@commit`) or NGC\u002FS3 versions to an immutable release.\n- `load_model` should call `package.resolve(...)`, load checkpoints on CPU first, set modules to `eval()`, and disable gradients where appropriate.\n- Use `weights_only=False` only when loading a pickled full PyTorch object is required.\n- Decorate optional model classes and `load_model` with `@check_optional_dependencies()`.\n- Use `loguru.logger` for useful loading messages; do not use `print()` inside `earth2studio\u002F`.\n\n### Step 7 - Write Tests\n\nFile: `test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py`\n\nRequired tests:\n\n| Function | Purpose |\n|----------|---------|\n| `test_\u003Cmodel>_call` | Forward pass with mock or simple model |\n| `test_\u003Cmodel>_exceptions` | Invalid coordinate order, values, or variables raise errors |\n| `test_\u003Cmodel>_package` | Real weights with `@pytest.mark.package` for AutoModel\u002Fgenerative diagnostics |\n\nGenerative diagnostics also require sample-count and deterministic-seed tests.\nUse `references\u002Ftesting-guide.py`. Create a `Phoo\u003CModelName>` dummy that matches\nthe real core model's interface and produces deterministic output.\n\nRun focused tests:\n\n```bash\nuv run pytest test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py -m \"not package\" -v\nuv run pytest test\u002Fmodels\u002Fdx\u002Ftest_\u003Cname>.py::test_\u003Cmodel>_package --package -v\n```\n\nDo not omit package tests for packaged models. If arbitrary random inputs are not\nphysically valid for the real checkpoint, build a stable model-appropriate input\nwhile still loading real weights and running a forward pass.\n\n### Step 8 - Register Model\n\nFor public models, update `earth2studio\u002Fmodels\u002Fdx\u002F__init__.py` alphabetically.\nSkip registration only when the user explicitly wants an internal or experimental\nfile that should not be exported.\n\n### Step 9 - Documentation\n\nFor public models:\n\n- Add to `docs\u002Fmodules\u002Fmodels_dx.rst` alphabetically so API docs include the generated page.\n- Add to `docs\u002Fuserguide\u002Fabout\u002Finstall.md` if a model extra exists. Include model notes plus both `pip install earth2studio[model-name]` and `uv add earth2studio --extra model-name` instructions.\n- Update `CHANGELOG.md` under `### Added`.\n\nFormat and lint:\n\n```bash\nmake format && make lint && make license\n```\n\n### Step 10 - Validation (if requested)\n\nFollow `references\u002Fvalidation-guide.md`. Create uncommitted vanilla,\nEarth2Studio, comparison, and sanity-check scripts. Do not commit generated\noutputs, checkpoints, images, or local validation scripts.\n\nFor generative diagnostics, fix seeds and compare matching samples or report\nstatistical\u002Ftolerance-based agreement when exact equality is impossible.\nAsk the user to visually inspect plots before proceeding.\n\n### Step 11 - PR (if requested)\n\nFollow `references\u002Fvalidation-guide.md` and use:\n\n- `references\u002Fpr-body-template.md`\n- `references\u002Fpr-comment-template.md`\n\nBefore creating the PR, verify dependency extras, `all`, install docs, API docs,\nchangelog, tests, and validation artifacts are consistent. Do not include machine\nnames, hostnames, absolute paths, cache paths, device inventory, or uploaded image\nlinks in PR text. Use plot placeholders for manual image upload.\n\n## Examples\n\n### Simple Diagnostic\n\n```text\nUser: Create a diagnostic that computes wind speed from u10m and v10m.\nAgent: Reads SKILL.md, classifies as simple, creates windspeed.py with only\n       torch.nn.Module, writes call and exception tests, runs focused pytest.\n```\n\n### AutoModel Diagnostic\n\n```text\nUser: Add a precipitation estimator from this reference script.\nAgent: Reads SKILL.md and references, proposes dependency extra, creates a\n       torch.nn.Module + AutoModelMixin wrapper, writes mock\u002Fpackage tests,\n       updates docs\u002Fchangelog\u002Fdependencies, and runs validation commands.\n```\n\n### Generative Diagnostic\n\n```text\nUser: Wrap this diffusion super-resolution model.\nAgent: Classifies as generative, adds sample output coordinates, supports seed\n       handling, writes sample and deterministic-seed tests, and prepares seeded\n       validation comparisons.\n```\n\n## Troubleshooting\n\n| Error | Solution |\n|-------|----------|\n| `OptionalDependencyFailure` | Install with `uv sync --extra \u003Cmodel-extra>` or fix the extra name |\n| Coordinate handshake fails | Check `OrderedDict` order and `handshake_dim` indices |\n| Wrong output shape | Verify `output_coords` lengths match returned tensor shape |\n| `ModuleNotFoundError: pytest` | Use `uv run pytest`, not bare `pytest` |\n| Package test fails on random input | Use a stable physically plausible input while still loading real weights |\n\n## Reminders\n\nDo:\n\n- Use `uv run python` and `uv run pytest` for all Python commands.\n- Use `@batch_coords()` on `output_coords`.\n- Use `@torch.inference_mode()` and `@batch_func()` on `__call__`.\n- Keep `batch` as the first coordinate with `np.empty(0)` in `input_coords`.\n- Validate coordinates with `handshake_dim()` and `handshake_coords()`.\n- Add `sample` in generative `output_coords`.\n- Include the repo-standard SPDX\u002Flicense header in every Python file.\n- Use `loguru.logger`, never `print()`, inside `earth2studio\u002F`.\n\nDo not:\n\n- Inherit from `PrognosticMixin`.\n- Include `lead_time` coordinates.\n- Create `create_iterator`.\n- Create general base classes for a single wrapper without a clear multi-variant need.\n- Commit API keys, credentials, validation scripts, plots, or generated outputs.\n- Read from `evals\u002Ftargets\u002F`.\n\n## Self-Improvement\n\nIf this skill produces incorrect outputs, update it before continuing:\n\n1. Identify the issue in the generated code or workflow.\n2. Edit `SKILL.md` or the relevant file in `references\u002F` to fix the guidance.\n3. Run focused validation for the changed skill files.\n4. Commit the skill fix separately when working in a branch that expects commits.\n5. Continue the model implementation with the corrected workflow.\n",{"name":5,"license":15,"version":44,"metadata":45,"description":50,"argument-hint":51},"0.16.0",{"tags":46,"author":49},[47,48,23],"earth2studio","diagnostic-model","NVIDIA Earth-2 Team \u003Cagent-skills@nvidia.com>","Create Earth2Studio diagnostic model wrappers for single-step data transformations, including simple derived diagnostics, packaged AutoModel diagnostics, and generative or diffusion diagnostics. Do NOT use for prognostic time-stepping models, data sources, or installation.\n","URL or local path to reference inference script (optional)","claude\u002Finstall-gsd-build-foQdV","d86cd127f527124b5fd0fd0bc679a4d79b7d01d7",".agents\u002Fskills\u002Fearth2studio-create-diagnostic","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik","https:\u002F\u002Fnorvik-orpin.vercel.app","https:\u002F\u002Fgithub.com\u002Fpattanation","2026-07-17 11:17:04",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add pattanation\u002FNorvik --skill earth2studio-create-diagnostic",{"tool":65,"command":66},"bunx","bunx skills add pattanation\u002FNorvik --skill earth2studio-create-diagnostic",{"tool":68,"command":69},"pnpm","pnpm dlx skills add pattanation\u002FNorvik --skill earth2studio-create-diagnostic","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002FSKILL.md",true,[73,79,83,89,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"BENCHMARK.md","REFERENCE","参考文档",3502,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002FBENCHMARK.md",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"evals\u002Fconfig.yml",1401,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Fconfig.yml",{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"evals\u002Fenvironment\u002FDockerfile","OTHER","其他",1449,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Fenvironment\u002FDockerfile",{"path":90,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":93,"sourceHtmlUrl":94},"evals\u002Fenvironment\u002Fsetup\u002Fbootstrap.sh","SCRIPT","脚本",1279,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Fenvironment\u002Fsetup\u002Fbootstrap.sh",{"path":96,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":97,"sourceHtmlUrl":98},"evals\u002Fevals.json",5020,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Fevals.json",{"path":100,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":101,"sourceHtmlUrl":102},"evals\u002Ftargets\u002Feval_1_target.py",4169,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Ftargets\u002Feval_1_target.py",{"path":104,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":105,"sourceHtmlUrl":106},"evals\u002Ftargets\u002Feval_2_target.py",6170,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Ftargets\u002Feval_2_target.py",{"path":108,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":109,"sourceHtmlUrl":110},"evals\u002Ftargets\u002Feval_3_target.py",9692,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Ftargets\u002Feval_3_target.py",{"path":112,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":113,"sourceHtmlUrl":114},"evals\u002Ftargets\u002Ftest\u002Feval_1_test_target.py",4268,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Ftargets\u002Ftest\u002Feval_1_test_target.py",{"path":116,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":117,"sourceHtmlUrl":118},"evals\u002Ftargets\u002Ftest\u002Feval_2_test_target.py",5014,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Ftargets\u002Ftest\u002Feval_2_test_target.py",{"path":120,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":121,"sourceHtmlUrl":122},"evals\u002Ftargets\u002Ftest\u002Feval_3_test_target.py",7154,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fevals\u002Ftargets\u002Ftest\u002Feval_3_test_target.py",{"path":124,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":125,"sourceHtmlUrl":126},"references\u002Fmethod-templates.py",5964,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Freferences\u002Fmethod-templates.py",{"path":128,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":129,"sourceHtmlUrl":130},"references\u002Fpr-body-template.md",2763,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Freferences\u002Fpr-body-template.md",{"path":132,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":133,"sourceHtmlUrl":134},"references\u002Fpr-comment-template.md",2285,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Freferences\u002Fpr-comment-template.md",{"path":136,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":137,"sourceHtmlUrl":138},"references\u002Fskeleton-template.py",10642,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Freferences\u002Fskeleton-template.py",{"path":140,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":141,"sourceHtmlUrl":142},"references\u002Ftesting-guide.py",8039,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Freferences\u002Ftesting-guide.py",{"path":144,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":145,"sourceHtmlUrl":146},"references\u002Fvalidation-guide.md",4471,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Freferences\u002Fvalidation-guide.md",{"path":148,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":149,"sourceHtmlUrl":150},"skill-card.md",3942,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fskill-card.md",{"path":152,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":153,"sourceHtmlUrl":154},"skill.oms.sig",8293,"https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fearth2studio-create-diagnostic\u002Fskill.oms.sig",[156,188,214,238,260,275],{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":160,"sourceHtmlUrl":161,"categories":162,"keywords":171,"publishedAt":187},"01M71QDV4DM8T19HEHWATEF1K4","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FSKILL.md",[163,168],{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":169,"categoryName":170,"taxonomyType":166,"taxonomyTypeDesc":167},"01JBSEEDCAT000000000000009","前端开发",[172,173,174,24,175,34,176,177,178,179,180,181,182,183,184,185,186],"webapp","testing","webapp testing","applications","frontend","debugging","toolkit","logs","browser","with","playwright","web","behavior","ui","screenshots","2026-11-10 13:02:02",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":192,"sourceHtmlUrl":193,"categories":194,"keywords":196,"publishedAt":187},"01M71QDH2GGMXGA9105C9W1N7B","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fweb-artifacts-builder\u002FSKILL.md",[195],{"categoryNo":169,"categoryName":170,"taxonomyType":166,"taxonomyTypeDesc":167},[197,198,199,183,200,201,202,24,203,204,176,205,206,207,208,209,210,211,212,213],"builder","artifacts builder","artifacts","web artifacts builder","single-file","css","Tailwind","ui components","single","use","file","components","react","multi","state","routing","state management",{"skillNo":215,"name":216,"nameZh":6,"description":217,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":218,"licenseFileUrl":219,"sourceHtmlUrl":220,"categories":221,"keywords":223,"publishedAt":187},"01M71QD9T2XC3EWMQNN9ACNWQ1","vueuse-functions","Apply VueUse composables where appropriate to build concise, maintainable Vue.js \u002F Nuxt features.","MIT","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvueuse-functions\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvueuse-functions\u002FSKILL.md",[222],{"categoryNo":169,"categoryName":170,"taxonomyType":166,"taxonomyTypeDesc":167},[224,225,226,227,228,229,230,231,232,233,234,235,236,237],"functions","vueuse","vueuse functions","project","nuxt","apply","github","concise","build","https","features","vue","js","composables",{"skillNo":239,"name":240,"nameZh":6,"description":241,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":218,"licenseFileUrl":242,"sourceHtmlUrl":243,"categories":244,"keywords":247,"publishedAt":187},"01M71QD51HWSGYMCMB7RW7PGK8","vue-testing-best-practices","Use for Vue.js testing. Covers Vitest, Vue Test Utils, component testing, mocking, testing patterns, and Playwright for E2E testing.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-testing-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-testing-best-practices\u002FSKILL.md",[245,246],{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},{"categoryNo":169,"categoryName":170,"taxonomyType":166,"taxonomyTypeDesc":167},[248,173,249,235,250,182,251,252,253,230,254,24,255,256,257,206,258,236,259],"vue testing best practices","testing best practices","best practices","test","testing patterns","component","vitest","mocking","e2e","utils","patterns","e2e testing",{"skillNo":261,"name":262,"nameZh":6,"description":263,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":218,"licenseFileUrl":264,"sourceHtmlUrl":265,"categories":266,"keywords":268,"publishedAt":187},"01M71QD358H2DJ9THJRBP77T3T","vue-router-best-practices","Vue Router 4 patterns, navigation guards, route params, and route-component lifecycle interactions.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-router-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-router-best-practices\u002FSKILL.md",[267],{"categoryNo":169,"categoryName":170,"taxonomyType":166,"taxonomyTypeDesc":167},[269,235,270,250,271,253,272,230,258,273,274],"router","vue router best practices","route","guards","navigation","lifecycle",{"skillNo":276,"name":277,"nameZh":6,"description":278,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":218,"licenseFileUrl":279,"sourceHtmlUrl":280,"categories":281,"keywords":283,"publishedAt":187},"01M71QCYPNWDE2MQZ1TF3ED5S4","vue-best-practices","MUST be used for Vue.js tasks. Strongly recommends Composition API with `\u003Cscript setup>` and TypeScript as the standard approach. Covers Vue 3, SSR, Volar, vue-tsc. Load for any Vue, .vue files, Vue Router, Pinia, or Vite with Vue work. ALWAYS use Composition API unless the project explicitly requires Options API.","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-best-practices\u002FLICENSE.md","https:\u002F\u002Fgithub.com\u002Fpattanation\u002FNorvik\u002Fblob\u002Fclaude\u002Finstall-gsd-build-foQdV\u002F.agents\u002Fskills\u002Fvue-best-practices\u002FSKILL.md",[282],{"categoryNo":169,"categoryName":170,"taxonomyType":166,"taxonomyTypeDesc":167},[284,235,250,285,227,286,287,288,269,289,290,291,292,293,294,24,295,206,296,297],"vue best practices","Composition","files","tasks","api","pinia","work","options","ssr","typescript","as","vite","load","standard"]