← AMDCONTENT HISTORY

Update to AMD

Snapshot Nov 6, 2026 · 00:12 UTC · version 0.3.0

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save AMD and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Sep 30, 2026 · 23:13 UTC

7f832b8a3c4898e1453f60b461b79fb8d4c0e8889d930e0daf12af3c1e2ff938

After

Nov 6, 2026 · 00:12 UTC

ecff6eacb9367066be2b7dcbf31d962943a6d012b408265317d89f404678e064

Package file

Before

Sep 30, 2026 · 23:13 UTC

{"sha256":"671ee8519686294b03b4995bb3ba99045004bbccd328968bf38c30b3cc96c312","size":16453}

After

Nov 6, 2026 · 00:12 UTC

Not present

Package file

Before

Sep 30, 2026 · 23:13 UTC

{"sha256":"671ee8519686294b03b4995bb3ba99045004bbccd328968bf38c30b3cc96c312","size":16453}

After

Nov 6, 2026 · 00:12 UTC

Not present

Package file

Before

Sep 30, 2026 · 23:13 UTC

cbe68f54a64025845974c6d485a9b765a307f70548952b61be30b67e1835ac49

After

Nov 6, 2026 · 00:12 UTC

08213eda069ee496a17c663b941ca997407d543a9a49b92aa983dabca172600b

Compare saved observations

Download comparison JSON

Changed files

Choose a file to see its text changes. Binary or large files show metadata only.

.claude-plugin/marketplace.json →

.codex-plugin/assets/composer-icon.png →

.codex-plugin/assets/logo.png →

.codex-plugin/plugin.json →

.cursor-plugin/marketplace.json →

.gitattributes →

.github/ISSUE_TEMPLATE/product-repo-approval.yml →

.github/federation.json →

.github/lychee.toml →

.github/scripts/check.sh →

.github/scripts/federate_skills.py →

.github/scripts/federation_branches.py →

.github/scripts/federation_guard.py →

.github/scripts/generate_codex_plugin.py →

.github/scripts/import_external_skills.py →

.github/scripts/record_skill_owner.py →

.github/scripts/select_evals.py →

.github/scripts/sources.yml →

.github/scripts/test_cli_install.py →

.github/scripts/test_federate_skills.py →

.github/scripts/test_federation_guard.py →

.github/scripts/test_record_skill_owner.py →

.github/scripts/validate_marketplace.py →

.github/scripts/validate_skills.py →

.github/skill_owners.json →

.github/workflows/cli-install.yml →

.github/workflows/evals.yml →

.github/workflows/external-reference-check.yml →

.github/workflows/federate-skills.yml →

.github/workflows/federation-guard.yml →

.github/workflows/import-external-skills.yml →

.github/workflows/product-repo-approval.yml →

.github/workflows/validate.yml →

.gitignore →

CONTRIBUTING.md →

README.md →

docs/evals.md →

docs/rocm-docs/.readthedocs.yaml →

docs/rocm-docs/catalog.md →

docs/rocm-docs/conf.py →

docs/rocm-docs/sphinx/_toc.yml.in →

docs/rocm-docs/walkthroughs/hyperloom-workload-optimizer.md →

docs/rocm-docs/walkthroughs/index.md →

docs/rocm-docs/walkthroughs/lemonade-router-builder.md →

docs/rocm-docs/walkthroughs/local-ai-app-integration.md →

docs/rocm-docs/walkthroughs/local-ai-use.md →

docs/rocm-docs/walkthroughs/magpie-kernel-evaluator.md →

docs/rocm-docs/walkthroughs/serving-llms-on-epyc.md →

docs/rocm-docs/walkthroughs/serving-llms-on-instinct.md →

docs/rocm-docs/walkthroughs/tracelens-analysis-orchestrator.md →

docs/skill-requirements.md →

eval/TEMPLATE.json →

eval/agent.py →

eval/claude_eval.py →

eval/compare_skill.py →

eval/datasets.py →

eval/negatives.json →

eval/routing.py →

eval/run_evals.py →

eval/schema/evals.schema.json →

eval/schema/machine.schema.json →

eval/test_evals.py →

plugin-metadata.json →

skills/hyperloom-workload-optimizer/.federated.json →

skills/hyperloom-workload-optimizer/SKILL.md →

skills/hyperloom-workload-optimizer/evals/evals.json →

skills/hyperloom-workload-optimizer/evals/machine.yml →

skills/hyperloom-workload-optimizer/reference.md →

skills/hyperloom-workload-optimizer/scripts/_env.sh →

skills/hyperloom-workload-optimizer/scripts/launch.sh →

skills/hyperloom-workload-optimizer/scripts/launch_health.sh →

skills/hyperloom-workload-optimizer/scripts/preflight.py →

skills/hyperloom-workload-optimizer/scripts/resume.sh →

skills/hyperloom-workload-optimizer/scripts/tests/test_launch_flow.sh →

skills/hyperloom-workload-optimizer/scripts/tests/test_preflight.py →

skills/hyperloom-workload-optimizer/setup.md →

skills/hyperloom-workload-optimizer/skill-card.md →

skills/local-ai-app-integration/.federated.json →

skills/local-ai-use/.federated.json →

skills/local-ai-use/SKILL.md →

skills/local-ai-use/reference.md →

skills/local-ai-use/scripts/setup_local_ai.py →

skills/serving-llms-on-instinct/evals/machine.yml →

skills/tracelens-analysis-orchestrator/.federated.json →

skills/tracelens-analysis-orchestrator/SKILL.md →

skills/tracelens-analysis-orchestrator/agents/convolution-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/cpu-idle-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/elementwise-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/gemm-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/generic-op-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/kernel-coherence-agent.md →

skills/tracelens-analysis-orchestrator/agents/kernel-fusion-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/kernel-stem-preprocessing-agent.md →

skills/tracelens-analysis-orchestrator/agents/kernel-unification-agent.md →

skills/tracelens-analysis-orchestrator/agents/model-identification-agent.md →

skills/tracelens-analysis-orchestrator/agents/moe-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/multi-kernel-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/norm-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/reduce-analyzer.md →

skills/tracelens-analysis-orchestrator/agents/roofline-augment-agent.md →

skills/tracelens-analysis-orchestrator/agents/semantic-comparison-agent.md →

skills/tracelens-analysis-orchestrator/agents/triton-analyzer.md →

skills/tracelens-analysis-orchestrator/evals/.gitignore →

skills/tracelens-analysis-orchestrator/evals/EVAL_RUBRICS.md →

skills/tracelens-analysis-orchestrator/evals/README.md →

skills/tracelens-analysis-orchestrator/evals/analysis_tests/combined_traces_comparative.csv →

skills/tracelens-analysis-orchestrator/evals/analysis_tests/combined_traces_standalone.csv →

skills/tracelens-analysis-orchestrator/evals/eval_scripts/generate_ref.sh →

skills/tracelens-analysis-orchestrator/evals/eval_scripts/kill_eval_jobs.sh →

skills/tracelens-analysis-orchestrator/evals/eval_scripts/pack_test_archives.sh →

skills/tracelens-analysis-orchestrator/evals/eval_scripts/run_pi_analysis_in_docker.sh →

skills/tracelens-analysis-orchestrator/evals/eval_scripts/run_repeatability_parallel.sh →

skills/tracelens-analysis-orchestrator/evals/eval_utils/aggregate_repeatability.py →

skills/tracelens-analysis-orchestrator/evals/eval_utils/compare_lca_partitions.py →

skills/tracelens-analysis-orchestrator/evals/eval_utils/manual_eval_checklist.md →

skills/tracelens-analysis-orchestrator/evals/eval_utils/merge_results.py →

skills/tracelens-analysis-orchestrator/evals/eval_utils/quality_scripted_evals.py →

skills/tracelens-analysis-orchestrator/evals/eval_utils/report_section_rules.yaml →

skills/tracelens-analysis-orchestrator/evals/eval_utils/workflow_scripted_evals.py →

skills/tracelens-analysis-orchestrator/evals/evals.json →

skills/tracelens-analysis-orchestrator/evals/hooks.py →

skills/tracelens-analysis-orchestrator/evals/machine.yml →

skills/tracelens-analysis-orchestrator/evals/partial_tests/README.md →

skills/tracelens-analysis-orchestrator/evals/partial_tests/eval_utils/semantic_partition_scripted_evals.py →

skills/tracelens-analysis-orchestrator/evals/partial_tests/eval_utils/semantic_purity_aggregate.py →

skills/tracelens-analysis-orchestrator/evals/partial_tests/generate_gold_ref.sh →

skills/tracelens-analysis-orchestrator/evals/partial_tests/partial_test_cases.csv →

skills/tracelens-analysis-orchestrator/evals/partial_tests/run_partial_tests.sh →

skills/tracelens-analysis-orchestrator/evals/skills/eval-post-processing/SKILL.md →

skills/tracelens-analysis-orchestrator/evals/skills/eval-post-processing/reference.md →

skills/tracelens-analysis-orchestrator/evals/skills/eval-post-processing/run_post_processing.py →

skills/tracelens-analysis-orchestrator/evals/skills/quality-llm-eval/SKILL.md →

skills/tracelens-analysis-orchestrator/evals/skills/quality-llm-eval/reference.md →

skills/tracelens-analysis-orchestrator/evals/skills/workflow-llm-eval/SKILL.md →

skills/tracelens-analysis-orchestrator/evals/skills/workflow-llm-eval/reference.md →

skills/tracelens-analysis-orchestrator/reference.md →

skills/tracelens-analysis-orchestrator/templates/analysis_template.md →

skills/tracelens-analysis-orchestrator/templates/sub_agent_spec.md →

staging/rocm-doctor/SKILL.md →

staging/rocm-doctor/evals/evals.json →

staging/rocm-doctor/reference.md →

staging/rocm-doctor/skill-card.md →

walkthroughs/README.md →

walkthroughs/hyperloom-workload-optimizer.md →

walkthroughs/lemonade-router-builder.md →

walkthroughs/local-ai-app-integration.md →

walkthroughs/local-ai-use.md →

walkthroughs/magpie-kernel-evaluator.md →

walkthroughs/serving-llms-on-epyc.md →

walkthroughs/serving-llms-on-instinct.md →

walkthroughs/tracelens-analysis-orchestrator.md →

.github/scripts/federate_skills.py

− removed · + added

--- before
+++ after
@@ -0,0 +1,1131 @@
+#!/usr/bin/env -S uv run --quiet
+# /// script
+# requires-python = ">=3.10"
+# dependencies = ["pyyaml>=6.0"]
+# ///
+"""Vendor skills from the external repositories declared in `.github/federation.json`.
+
+Each entry in that file names a GitHub repo, the branch to track, and the
+exact path of every skill folder to vendor from it. The branch defaults to
+`main`. It can also be a release pattern such as `release/*`, which tracks
+the matching branch with the highest version, release candidates included
+(see `federation_branches.py`). Tags and commits cannot be tracked: a source
+always follows a branch its owners merge to, and changing which one is a
+reviewed edit to `.github/federation.json`.
+
+For each declared skill, the script:
+
+1. Resolves the source's branch (picking the newest release branch for a
+   pattern) and shallow-clones the repo at it into a temp directory, using
+   sparse-checkout so only the declared skill paths are fetched.
+2. Hashes the upstream skill folder and compares it against the hash
+   recorded in the vendored copy's `.federated.json`. A skill whose
+   upstream contents are unchanged is left byte-for-byte as it is on
+   disk, so a run that finds no upstream change produces no diff at all
+   and therefore no pull request. If a skill is re-vendored anyway and
+   the resulting files match the copy already on disk, the previous
+   marker is restored, because a diff consisting only of a commit and a
+   hash is noise. Deleting a marker forces that skill to be re-vendored.
+3. Copies changed skill folders into `skills/<name>/` as a mirror of
+   upstream, `evals/` included. Anything the source repo does not ship is
+   removed. Files larger than `MAX_FILE_BYTES` (test archives, traces) are
+   not vendored: they are left out of the copy and of the content hash, and
+   named in the run log and the pull request body. The one file kept when
+   upstream lacks it is `evals/machine.yml` (`LOCAL_FALLBACK_FILES`).
+3b. Optionally vendors the skill under a different local catalog name (the
+   `as:` field on a skill entry). Federated skills follow a
+   `<projectrepo>-<skill>` naming convention in this catalog (e.g. the
+   `analysis-orchestrator` skill from TraceLens is vendored as
+   `tracelens-analysis-orchestrator`), so the local folder, marketplace
+   entry, and the SKILL.md `name` frontmatter are all set to the `as:`
+   value. The upstream folder name is still used to locate the skill in
+   its source repo.
+4. Writes `.federated.json` inside each copy with the source repo, the
+   tracked branch (plus the branch it resolved to, for a pattern), the
+   resolved commit, and the content hash, so we can tell
+   vendored skills apart from skills authored in this repo and detect the
+   next real upstream change.
+5. Rewrites relative markdown links that point outside the copied skill
+   folder (e.g. `examples/foo.yaml`, `docs/bar.md`) into absolute
+   github.com URLs pinned to the imported commit, so the offline link
+   checker doesn't flag them as missing local files. Links to files that
+   were actually copied into the skill folder are left untouched.
+6. Synthesizes a minimal `skill-card.md` (Description, Owner, License)
+   from the source metadata when the upstream copy doesn't already ship
+   one, so the imported skill satisfies the card validation gate (see
+   docs/skill-requirements.md).
+
+The marketplace manifests are never edited here. Whether a skill ships in
+the bundle is decided by hand in `.claude-plugin/marketplace.json`.
+
+Nothing is ever deleted here. A vendored skill that is no longer declared
+in `.github/federation.json` is reported and left alone; removing it is a
+deliberate pull request by a maintainer.
+
+Usage:
+    uv run .github/scripts/federate_skills.py                 # vendor changed skills
+    uv run .github/scripts/federate_skills.py --check-catalog # validate the file
+    uv run .github/scripts/federate_skills.py --only tracelens-analysis-orchestrator
+
+The `--only` flag (repeatable) restricts the run to the named *local*
+skill folder(s) (the `as:` name when one is set); other skills in the
+catalog are left untouched.
+
+`--summary-json PATH` writes a machine-readable record of the run
+(including a ready-made pull request title and body) for the calling
+workflow to consume.
+
+`--list-skills` prints the declared local skill names (after `--only`) as a
+JSON array without cloning anything.
+
+The companion GitHub Actions workflow `federate-skills` runs this script
+nightly and on demand: it lists the skills with `--list-skills`, then runs
+once per skill with `--only`, so each bumped skill gets its own pull request.
+"""
+
+from __future__ import annotations
+
+import argparse
+import hashlib
+import json
+import posixpath
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+from dataclasses import dataclass, field
+from datetime import datetime, timezone
+from pathlib import Path
+from typing import Iterable
+
+import yaml
+
+sys.path.insert(0, str(Path(__file__).resolve().parent))
+
+import federation_branches as branches  # noqa: E402
+
+REPO_ROOT = Path(__file__).resolve().parent.parent.parent
+CATALOG_FILE = REPO_ROOT / ".github" / "federation.json"
+SKILLS_DIR = REPO_ROOT / "skills"
+MARKER_FILENAME = ".federated.json"
+# Never part of a skill's content: these appear only in a working copy, and
+# hashing them would make change detection depend on whether someone happened
+# to run the tests before the importer.
+IGNORED_DIR_NAMES = {"__pycache__", ".pytest_cache"}
+# Larger upstream files stay upstream. 100KB limit.
+MAX_FILE_BYTES = 100 * 1024
+# Kept from the catalog's copy when upstream does not ship them. `machine.yml`
+# names the runners a skill's evals need, and the catalog's runner pool is not
+# the product repo's, so the catalog may have to say it where upstream does
+# not. When upstream does ship one, upstream's wins like any other file.
+LOCAL_FALLBACK_FILES = ("evals/machine.yml",)
+CARD_FILENAME = "skill-card.md"
+
+FRONTMATTER_RE = re.compile(
+    r"\A---\s*\n(?P<frontmatter>.*?)\n---\s*\n?(?P<body>.*)\Z",
+    re.DOTALL,
+)
+# The `name:` line inside a SKILL.md frontmatter block. Used to rewrite the
+# frontmatter `name` when a skill is vendored under a different local name.
+NAME_FIELD_RE = re.compile(r"(?m)^(?P<key>name[ \t]*:[ \t]*)(?P<value>.*)$")
+# Inline markdown links and images: `[text](target)` / `![alt](target)`,
+# with an optional `"title"` after the target. The `target` group captures
+# everything up to whitespace or the closing paren.
+MARKDOWN_LINK_RE = re.compile(
+    r"(?P<prefix>!?\[[^\]]*\]\()(?P<target>[^)\s]+)(?P<suffix>(?:\s+\"[^\"]*\")?\))"
+)
+# Anything with an explicit URI scheme (https://, mailto:, etc.).
+URI_SCHEME_RE = re.compile(r"^[a-zA-Z][a-zA-Z0-9+.-]*:")
+# Marketplace descriptions are read by humans browsing the catalog; truncate
+# very long SKILL.md descriptions so the listing stays readable. The full
+# description is still available in the vendored SKILL.md.
+MARKETPLACE_DESCRIPTION_MAX = 320
+
+REPO_RE = re.compile(r"^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$")
+SOURCE_KEYS = {"repo", "license", "branch", "skills"}
+SKILL_KEYS = {"path", "as", "marketplace_description"}
+# Keys that would pin a source to something other than a branch. They are
+# rejected with a pointed message rather than ignored, so an entry that tries
+# to track a tag or commit fails loudly instead of silently tracking `main`.
+PINNING_KEYS = {"ref", "tag", "commit", "rev", "revision"}
+
+
+@dataclass
+class SkillSpec:
+    """One skill folder to vendor, addressed by its full path in the source repo."""
+
+    path: str
+    local_name: str | None = None
+    marketplace_description_override: str | None = None
+
+    @property
+    def folder(self) -> str:
+        """Upstream folder name (the last path segment)."""
+        return posixpath.basename(self.path)
+
+    @property
+    def dest_name(self) -> str:
+        """Local catalog name: the `as:` override, or the upstream folder."""
+        return self.local_name or self.folder
+
+
+@dataclass
+class Source:
+    repo: str
+    license: str
+    skills: list[SkillSpec] = field(default_factory=list)
+    # As declared: a branch name, or a pattern such as `release/*`.
+    branch: str = branches.DEFAULT_BRANCH
+
+    @property
+    def name(self) -> str:
+        """Stable slug for the source, derived from `owner/repo`."""
+        return re.sub(r"[^a-z0-9]+", "-", self.repo.lower()).strip("-")
+
+
+@dataclass
+class ImportResult:
+    source: Source
+    folder: str
+    path: str
+    commit: str
+    updated: bool
+    # The branch actually cloned: `source.branch` itself, or the newest
+    # release branch it matched.
+    branch: str = branches.DEFAULT_BRANCH
+    skill_description: str = ""
+    marketplace_description: str = ""
+    # Upstream files over `MAX_FILE_BYTES`, relative to the skill folder.
+    omitted: list[str] = field(default_factory=list)
+
+    @property
+    def short_commit(self) -> str:
+        return self.commit[:7]
+
+
+def parse_federation(catalog: Path) -> list[Source]:
+    """Parse and validate `.github/federation.json`.
+
+    Unknown keys are rejected rather than ignored: the file is hand-edited by
+    contributors registering a skill, and a typo that silently vendors the
+    wrong thing (or nothing) is worse than a failed run.
+    """
+    if not catalog.exists():
+        raise FileNotFoundError(f"Federation file not found: {catalog}")
+    try:
+        data = json.loads(catalog.read_text(encoding="utf-8"))
+    except json.JSONDecodeError as exc:
+        raise ValueError(f"{catalog} is not valid JSON: {exc}") from None
+    if not isinstance(data, dict):
+        raise ValueError(f"{catalog} must contain a JSON object.")
+    raw_sources = data.get("sources")
+    if not isinstance(raw_sources, list) or not raw_sources:
+        raise ValueError(f"{catalog} must define a non-empty `sources` array.")
+
+    sources: list[Source] = []
+    for idx, raw in enumerate(raw_sources):
+        where = f"sources[{idx}]"
+        if not isinstance(raw, dict):
+            raise ValueError(f"{where} must be an object.")
+        pinning = PINNING_KEYS & set(raw)
+        if pinning:
+            raise ValueError(
+                f"{where} sets {sorted(pinning)}, but federated sources track a "
+                "branch, never a tag or commit. Use `branch` instead (e.g. "
+                f"{branches.DEFAULT_BRANCH!r} or 'release/*'), or leave it out "
+                f"to track {branches.DEFAULT_BRANCH!r}."
+            )
+        unknown = set(raw) - SOURCE_KEYS
+        if unknown:
+            raise ValueError(
+                f"{where} has unknown key(s) {sorted(unknown)}; expected "
+                f"{sorted(SOURCE_KEYS)}."
+            )
+        repo = raw.get("repo")
+        if not isinstance(repo, str) or not REPO_RE.match(repo):
+            raise ValueError(
+                f'{where}.repo must be a GitHub "<owner>/<repo>" string, got '
+                f"{repo!r}."
+            )
+        branch = branches.validate_branch(raw.get("branch"), f"{where}.branch")
+
+        skills_raw = raw.get("skills")
+        if not isinstance(skills_raw, list) or not skills_raw:
+            raise ValueError(
+                f"{where} ({repo}) must list at least one skill under `skills`."
+            )
+
+        skills: list[SkillSpec] = []
+        for sk_idx, sk in enumerate(skills_raw):
+            sk_where = f"{where}.skills[{sk_idx}]"
+            if not isinstance(sk, dict):
+                raise ValueError(
+                    f"{sk_where} must be an object with a `path` key. Every "
+                    "skill in a repo is declared individually."
+                )
+            unknown = set(sk) - SKILL_KEYS
+            if unknown:
+                raise ValueError(
+                    f"{sk_where} has unknown key(s) {sorted(unknown)}; expected "
+                    f"{sorted(SKILL_KEYS)}."
+                )
+            path = sk.get("path")
+            if not isinstance(path, str) or not path.strip("/"):
+                raise ValueError(
+                    f"{sk_where}.path must be the skill folder's path inside "
+                    f'{repo}, e.g. "skills/my-skill".'
+                )
+            path = path.replace("\\", "/").strip("/")
+            if ".." in path.split("/"):
+                raise ValueError(f"{sk_where}.path must not contain '..': {path!r}")
+            local_name = sk.get("as")
+            if local_name is not None and (
+                not isinstance(local_name, str) or "/" in local_name
+            ):
+                raise ValueError(
+                    f"{sk_where}.as must be a plain local folder name, got "
+                    f"{local_name!r}."
+                )
+            skills.append(
+                SkillSpec(
+                    path=path,
+                    local_name=local_name,
+                    marketplace_description_override=sk.get("marketplace_description"),
+                )
+            )
+
+        sources.append(
+            Source(
+                repo=repo,
+                license=raw.get("license") or "UNKNOWN",
+                skills=skills,
+                branch=branch,
+            )
+        )
+    return sources
+
+
+def run(cmd: list[str], cwd: Path | None = None) -> str:
+    """Run a command, raise on failure, return stdout."""
+    result = subprocess.run(
+        cmd,
+        cwd=cwd,
+        check=True,
+        text=True,
+        capture_output=True,
+    )
+    return result.stdout.strip()
+
+
+def remote_branches(repo: str) -> list[str]:
+    """Names of every branch on `repo`, read without cloning."""
+    out = run(["git", "ls-remote", "--heads", f"https://github.com/{repo}.git"])
+    prefix = "refs/heads/"
+    names = []
+    for line in out.splitlines():
+        _, _, ref = line.partition("\t")
+        if ref.startswith(prefix):
+            names.append(ref[len(prefix) :])
+    return names
+
+
+def resolve_branch(source: Source) -> str:
+    """The branch to clone for `source`: its own, or its newest release branch."""
+    if not branches.is_pattern(source.branch):
+        return source.branch
+    resolved = branches.latest_matching(source.branch, remote_branches(source.repo))
+    if resolved is None:
+        raise ValueError(
+            f"{source.repo} has no branch matching {source.branch!r} with a "
+            "version number (such as 0.13 or 0.13-rc1) in place of the '*'."
+        )
+    return resolved
+
+
+def shallow_clone(repo: str, branch: str, sub_paths: Iterable[str], dest: Path) -> str:
+    """Sparse + blobless clone of `repo` at `branch`, restricted to `sub_paths`.
+
+    Returns the resolved commit SHA. Sparse-checkout avoids pulling the
+    whole repo when only a few sub-trees are needed (the AMD-AGI/Apex tree
+    is large; we only want `tools/skills`).
+
+    Line endings are forced to LF so the checkout is byte-identical
+    everywhere: the content hashes computed from it drive change detection,
+    and they must mean the same thing on a maintainer's Windows machine and
+    on a Linux runner.
+
+    Background maintenance is disabled because it outlives the clone: a
+    blobless clone hands commit-graph writing to a detached process that
+    keeps creating files under `.git/objects/info/`, which then races the
+    removal of the temp directory this clone lives in.
+    """
+    url = f"https://github.com/{repo}.git"
+    run(
+        [
+            "git",
+            "-c",
+            "gc.auto=0",
+            "-c",
+            "maintenance.auto=false",
+            "-c",
+            "fetch.writeCommitGraph=false",
+            "clone",
+            "--filter=blob:none",
+            "--sparse",
+            "--no-checkout",
+            "--single-branch",
+            "--branch",
+            branch,
+            url,
+            str(dest),
+        ]
+    )
+    run(["git", "config", "core.autocrlf", "false"], cwd=dest)
+    run(["git", "config", "core.eol", "lf"], cwd=dest)
+    run(["git", "sparse-checkout", "set", "--cone", *sub_paths], cwd=dest)
+    run(["git", "checkout", branch], cwd=dest)
+    return run(["git", "rev-parse", "HEAD"], cwd=dest)
+
+
+def content_hash(root: Path, exclude: Iterable[str] = ()) -> str:
+    """Hash every file under `root` (relative paths and bytes).
+
+    Change detection compares this against the hash stored in the vendored
+    copy's marker, so a skill is re-vendored when its upstream folder's
+    contents change, not merely when its source repo gets some unrelated
+    commit. Without that distinction every commit to a large product repo
+    would churn the vendored copies (the marker and the commit-pinned links)
+    and open a pull request with no substance in it.
+
+    Files are fed to the digest ordered by their POSIX relative path rather
+    than by sorting `Path` objects, because `Path` comparison is
+    case-insensitive on Windows: `sorted()` puts `SKILL.md` after `agents/`
+    on a maintainer's machine and before it on a Linux runner, which would
+    hash identical files to different digests.
+
+    Files over `MAX_FILE_BYTES` are left out, since they are never vendored.
+    `exclude` names relative paths to leave out of the digest.
+    """
+    skipped = set(exclude)
+    entries = sorted(
+        (
+            (path.relative_to(root).as_posix(), path)
+            for path in root.rglob("*")
+            if path.is_file() and path.stat().st_size <= MAX_FILE_BYTES
+        ),
+        key=lambda entry: entry[0],
+    )
+    digest = hashlib.sha256()
+    for rel, path in entries:
+        if rel in skipped or IGNORED_DIR_NAMES.intersection(rel.split("/")[:-1]):
+            continue
+        digest.update(rel.encode("utf-8"))
+        digest.update(b"\0")
+        digest.update(hashlib.sha256(path.read_bytes()).digest())
+    return digest.hexdigest()
+
+
+def list_repo_files(clone_dir: Path, commit: str) -> set[str]:
+    """Return every tracked path in the repo at `commit` (POSIX style).
+
+    Uses `git ls-tree`, which reads tree objects only, so it works even on a
+    blob-filtered, sparse checkout without fetching file contents.
+    """
+    out = run(["git", "ls-tree", "-r", "--name-only", commit], cwd=clone_dir)
+    return {line.strip() for line in out.splitlines() if line.strip()}
+
+
+def _should_skip_target(target: str) -> bool:
+    """True for targets that are not repo-relative file paths.
+
+    Skips absolute URLs (`https://...`), scheme links (`mailto:`), in-page
+    anchors (`#section`), root-absolute paths (`/foo`), and protocol-relative
+    URLs (`//host/...`).
+    """
+    t = target.strip()
+    if not t:
+        return True
+    if t[0] in "#/":
+        return True
+    if URI_SCHEME_RE.match(t):
+        return True
+    return False
+
+
+def rewrite_external_references(
+    skill_dir: Path,
+    repo_skill_path: str,
+    repo_files: set[str],
+    repo: str,
+    commit: str,
+    log: list[str],
+    omitted: Iterable[str] = (),
+) -> None:
+    """Rewrite relative links that escape the skill folder into GitHub URLs.
+
+    A vendored skill often links to files that live elsewhere in its source
+    repo (e.g. `examples/foo.yaml`, `docs/bar.md`). Those paths don't exist
+    inside the copied skill folder, so the offline link checker flags them as
+    missing files. For each such link we point at the upstream repo on
+    github.com, pinned to the imported `commit`.
+
+    Links that resolve to a file actually present inside the skill folder
+    (e.g. `reference.md`) are left untouched so they keep working locally.
+    `omitted` names files inside the skill (relative to it) that were not
+    copied, so links to them are rewritten too.
+    """
+    repo_skill_path = repo_skill_path.strip("/")
+    not_copied = {f"{repo_skill_path}/{rel}" for rel in omitted}
+
+    def replace_in(text: str, repo_dir: str) -> tuple[str, list[tuple[str, str]]]:
+        rewrites: list[tuple[str, str]] = []
+
+        def _sub(match: re.Match[str]) -> str:
+            target = match.group("target")
+            if _should_skip_target(target):
+                return match.group(0)
+            path_part, sep, anchor = target.partition("#")
+            frag = sep + anchor if sep else ""
+            if not path_part:
+                return match.group(0)
+
+            # Resolve the link as the markdown spec would (relative to the
+            # file's folder in the repo), then relative to the skill root and
+            # the repo root, since skill docs often write paths that way.
+            file_rel = posixpath.normpath(posixpath.join(repo_dir, path_part))
+            skill_rel = posixpath.normpath(posixpath.join(repo_skill_path, path_part))
+            root_rel = posixpath.normpath(path_part)
+
+            within_skill = file_rel == repo_skill_path or file_rel.startswith(
+                repo_skill_path + "/"
+            )
+            if within_skill and file_rel in repo_files and file_rel not in not_copied:
+                # Genuine intra-skill link; it was copied, leave it local.
+                return match.group(0)
+
+            if file_rel in repo_files:
+                chosen = file_rel
+            elif skill_rel in repo_files:
+                chosen = skill_rel
+            else:
+                chosen = root_rel
+
+            # Can't map something that points above the repo root.
+            if chosen.startswith("..") or chosen.startswith("/"):
+                return match.group(0)
+
+            url = f"https://github.com/{repo}/blob/{commit}/{chosen}{frag}"
+            rewrites.append((target, url))
+            return f"{match.group('prefix')}{url}{match.group('suffix')}"
+
+        return MARKDOWN_LINK_RE.sub(_sub, text), rewrites
+
+    for md_path in sorted(skill_dir.rglob("*.md")):
+        original = md_path.read_text(encoding="utf-8")
+        md_dir = md_path.parent.relative_to(skill_dir).as_posix()
+        updated, rewrites = replace_in(
+            original, posixpath.normpath(posixpath.join(repo_skill_path, md_dir))
+        )
+        if updated != original:
+            md_path.write_text(updated, encoding="utf-8")
+            rel = md_path.relative_to(skill_dir.parent).as_posix()
+            for old, new in rewrites:
+                log.append(f"    [{rel}] {old} -> {new}")
+
+
+def parse_frontmatter(text: str) -> dict:
+    match = FRONTMATTER_RE.match(text)
+    if not match:
+        return {}
+    try:
+        data = yaml.safe_load(match.group("frontmatter"))
+    except yaml.YAMLError:
+        return {}
+    return data if isinstance(data, dict) else {}
+
+
+def truncate_description(text: str, limit: int = MARKETPLACE_DESCRIPTION_MAX) -> str:
+    text = " ".join(text.split())
+    if len(text) <= limit:
+        return text
+    # Cut at the last sentence boundary that still fits.
+    cut = text[: limit - 1]
+    last_period = cut.rfind(". ")
+    if last_period >= int(limit * 0.6):
+        return cut[: last_period + 1]
+    return cut.rstrip(",;:") + "…"
+
+
+def read_marker(skill_dir: Path) -> dict:
+    """Parse a vendored skill's `.federated.json`, or return {} if absent.
+
+    A corrupt marker reads as {} so the next run re-vendors the skill and
+    rewrites the marker cleanly.
+    """
+    marker = skill_dir / MARKER_FILENAME
+    if not marker.exists():
+        return {}
+    try:
+        data = json.loads(marker.read_text(encoding="utf-8"))
+    except json.JSONDecodeError:
+        return {}
+    return data if isinstance(data, dict) else {}
+
+
+def find_federated_skills() -> dict[str, dict]:
+    """Return {skill_folder_name: parsed marker JSON} for every existing
+    skill that has a `.federated.json` marker."""
+    found: dict[str, dict] = {}
+    if not SKILLS_DIR.exists():
+        return found
+    for skill_dir in SKILLS_DIR.iterdir():
+        if not skill_dir.is_dir() or skill_dir.name.startswith("."):
+            continue
+        if (skill_dir / MARKER_FILENAME).exists():
+            found[skill_dir.name] = read_marker(skill_dir)
+    return found
+
+
+def is_up_to_date(
+    marker: dict,
+    source: Source,
+    spec: SkillSpec,
+    upstream_hash: str,
+) -> bool:
+    """True when the vendored copy already matches this upstream folder.
+
+    The repo and path are compared alongside the hash because they change
+    what the vendored copy should contain: markdown links are rewritten to
+    absolute URLs under the source repo, so re-pointing a skill at a
+    different repo or path has to re-vendor even if the files are identical.
+    The declared branch is compared rather than the one a pattern resolved
+    to, so a new release branch with the same skill contents is not a bump.
+    """
+    return (
+        bool(upstream_hash)
+        and marker.get("content_hash") == upstream_hash
+        and marker.get("repo") == source.repo
+        and marker.get("path") == spec.path
+        and marker.get("ref") == source.branch
+    )
+
+
+def copy_skill(src: Path, dest: Path) -> list[str]:
+    """Mirror the upstream skill folder into `dest`.
+
+    Anything upstream does not ship is removed, so a re-import is also how
+    an upstream deletion propagates, except for `LOCAL_FALLBACK_FILES`, which
+    are kept when upstream does not ship them. Files over `MAX_FILE_BYTES`
+    are not copied; their paths, relative to the skill, are returned.
+    """
+    kept = {
+        rel: (dest / rel).read_bytes()
+        for rel in LOCAL_FALLBACK_FILES
+        if (dest / rel).is_file() and not (src / rel).is_file()
+    }
+    if dest.is_dir():
+        shutil.rmtree(dest)
+    elif dest.exists():
+        dest.unlink()
+
+    omitted: list[str] = []
+
+    def ignore(directory: str, names: list[str]) -> set[str]:
+        large = set()
+        for name in names:
+            path = Path(directory) / name
+            if path.is_file() and path.stat().st_size > MAX_FILE_BYTES:
+                large.add(name)
+                omitted.append(path.relative_to(src).as_posix())
+        return large
+
+    shutil.copytree(src, dest, ignore=ignore)
+    for rel, data in kept.items():
+        (dest / rel).parent.mkdir(parents=True, exist_ok=True)
+        (dest / rel).write_bytes(data)
+    return sorted(omitted)
+
+
+def write_marker(
+    skill_dir: Path,
+    source: Source,
+    branch: str,
+    commit: str,
+    relative_path: str,
+    upstream_hash: str,
+) -> None:
+    marker = {
+        "source": source.name,
+        "repo": source.repo,
+        "ref": source.branch,
+    }
+    if branch != source.branch:
+        marker["resolved_ref"] = branch
+    marker |= {
+        "commit": commit,
+        "path": relative_path,
+        "license": source.license,
+        "content_hash": upstream_hash,
+        "imported_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
+    }
+    (skill_dir / MARKER_FILENAME).write_text(
+        json.dumps(marker, indent=2) + "\n", encoding="utf-8"
+    )
+
+
+def write_card(skill_dir: Path, source: Source, description: str) -> None:
+    """Write a minimal skill-card.md unless the upstream copy shipped one.
+
+    Federated skills are copied wholesale (`copy_skill` does rmtree +
+    copytree), so any card authored here would be wiped on re-import. When
+    upstream doesn't provide a card, synthesize one from the source metadata
+    so the imported skill still satisfies the card validation gate.
+    """
+    card = skill_dir / CARD_FILENAME
+    if card.exists():
+        return
+    owner_org = source.repo.split("/")[0]
+    license_text = source.license or f"See [{source.repo}](https://github.com/{source.repo})"
+    card.write_text(
+        "# Skill Card\n\n"
+        "## Description\n\n"
+        f"{description}\n\n"
+        "## Owner\n\n"
+        f"{owner_org} (federated from "
+        f"[{source.repo}](https://github.com/{source.repo}))\n\n"
+        "## License\n\n"
+        f"{license_text}\n",
+        encoding="utf-8",
+    )
+
+
+def rewrite_skill_name(skill_dir: Path, new_name: str, log: list[str]) -> None:
+    """Set the SKILL.md frontmatter `name` to `new_name`.
+
+    Upstream ships its own `name` (e.g. `analysis-orchestrator`), but this
+    repo's validator requires the frontmatter `name` to match the skill's
+    directory name. When a skill is vendored under a different local name
+    (the `as:` field), rewrite the frontmatter so the imported copy stays
+    valid without hand-editing after every refresh.
+    """
+    skill_md = skill_dir / "SKILL.md"
+    text = skill_md.read_text(encoding="utf-8")
+    match = FRONTMATTER_RE.match(text)
+    if not match:
+        return
+    fm_start, fm_end = match.span("frontmatter")
+    frontmatter = match.group("frontmatter")
+
+    new_frontmatter, count = NAME_FIELD_RE.subn(
+        lambda m: f"{m.group('key')}{new_name}", frontmatter, count=1
+    )
+    if count == 0:
+        # No `name:` line to rewrite; prepend one so the copy stays valid.
+        new_frontmatter = f"name: {new_name}\n{frontmatter}"
+    if new_frontmatter == frontmatter:
+        return
+    skill_md.write_text(text[:fm_start] + new_frontmatter + text[fm_end:], encoding="utf-8")
+    log.append(f"    [SKILL.md] name -> {new_name}")
+
+
+def import_source(
+    source: Source,
+    log: list[str],
+) -> list[ImportResult]:
+    results: list[ImportResult] = []
+    # A failed cleanup must not fail the run: everything of value has already
+    # been copied out by then, and leaving a temp directory behind is cheaper
+    # than a red nightly job.
+    with tempfile.TemporaryDirectory(
+        prefix="amd-skills-import-", ignore_cleanup_errors=True
+    ) as tmpdir:
+        tmp_path = Path(tmpdir) / source.name
+        branch = resolve_branch(source)
+        if branch != source.branch:
+            log.append(f"[{source.name}] {source.branch} resolved to {branch}")
+        log.append(f"[{source.name}] cloning {source.repo}@{branch}")
+        commit = shallow_clone(
+            source.repo, branch, [spec.path for spec in source.skills], tmp_path
+        )
+        log.append(f"[{source.name}] resolved to commit {commit}")
+        repo_files = list_repo_files(tmp_path, commit)
+
+        for spec in source.skills:
+            src_skill = tmp_path / spec.path
+            if not src_skill.is_dir():
+                raise FileNotFoundError(
+                    f"Skill path {spec.path!r} not found in "
+                    f"{source.repo}@{branch}."
+                )
+            skill_md = src_skill / "SKILL.md"
+            if not skill_md.exists():
+                raise FileNotFoundError(
+                    f"Skill {spec.path!r} from {source.repo} has no SKILL.md."
+                )
+
+            dest_name = spec.dest_name
+            dest_skill = SKILLS_DIR / dest_name
+            marker = read_marker(dest_skill)
+            upstream_hash = content_hash(src_skill)
+            if is_up_to_date(marker, source, spec, upstream_hash):
+                log.append(
+                    f"[{source.name}] skills/{dest_name} is up to date "
+                    f"(unchanged upstream); left untouched"
+                )
+                results.append(
+                    ImportResult(
+                        source=source,
+                        folder=dest_name,
+                        path=spec.path,
+                        commit=marker.get("commit", commit),
+                        updated=False,
+                        branch=branch,
+                    )
+                )
+                continue
+
+            frontmatter = parse_frontmatter(skill_md.read_text(encoding="utf-8"))
+            description = frontmatter.get("description") or ""
+            if not isinstance(description, str) or not description.strip():
+                raise ValueError(
+                    f"Skill {spec.path!r} from {source.repo} has no "
+                    "non-empty `description` in its SKILL.md frontmatter."
+                )
+            marketplace_description = (
+                spec.marketplace_description_override
+                or truncate_description(description)
+            )
+
+            renamed = f" (as {dest_name})" if dest_name != spec.folder else ""
+            log.append(
+                f"[{source.name}] vendoring {spec.path} -> "
+                f"skills/{dest_name}{renamed}"
+            )
+            marker_path = dest_skill / MARKER_FILENAME
+            previous_marker = (
+                marker_path.read_bytes() if marker_path.is_file() else None
+            )
+            previous_content = (
+                content_hash(dest_skill, exclude=[MARKER_FILENAME])
+                if dest_skill.is_dir()
+                else None
+            )
+
+            omitted = copy_skill(src_skill, dest_skill)
+            for rel in omitted:
+                log.append(
+                    f"[{source.name}] skipped {spec.path}/{rel} "
+                    f"(over {MAX_FILE_BYTES // 1024} KB)"
+                )
+            write_marker(dest_skill, source, branch, commit, spec.path, upstream_hash)
+            write_card(dest_skill, source, marketplace_description)
+            rewrite_skill_name(dest_skill, dest_name, log)
+            rewrite_external_references(
+                dest_skill,
+                spec.path,
+                repo_files,
+                source.repo,
+                commit,
+                log,
+                omitted,
+            )
+
+            # The marker is bookkeeping, not content. If re-vendoring produced
+            # the same files as the copy already on disk, put the old marker
+            # back: a pull request whose entire diff is a hash and a timestamp
+            # tells a reviewer nothing. A marker still naming the branch the
+            # source used to track is kept out of that, or it would never move.
+            if (
+                previous_marker is not None
+                and marker.get("ref") == source.branch
+                and previous_content
+                == content_hash(dest_skill, exclude=[MARKER_FILENAME])
+            ):
+                marker_path.write_bytes(previous_marker)
+                log.append(
+                    f"[{source.name}] skills/{dest_name} re-vendored to "
+                    f"identical content; marker left at "
+                    f"{marker.get('commit', '?')[:7]}"
+                )
+                results.append(
+                    ImportResult(
+                        source=source,
+                        folder=dest_name,
+                        path=spec.path,
+                        commit=marker.get("commit", commit),
+                        updated=False,
+                        branch=branch,
+                    )
+                )
+                continue
+
+            results.append(
+                ImportResult(
+                    source=source,
+                    folder=dest_name,
+                    path=spec.path,
+                    commit=commit,
+                    updated=True,
+                    branch=branch,
+                    skill_description=description.strip(),
+                    marketplace_description=marketplace_description,
+                    omitted=omitted,
+                )
+            )
+    return results
+
+
+def report_undeclared(
+    declared: set[str],
+    existing: dict[str, dict],
+    log: list[str],
+) -> None:
+    """Note vendored skills that no source declares any more.
+
+    They are reported rather than deleted: removing a shipped skill is a
+    decision for a maintainer's pull request, not a side effect of a
+    scheduled run.
+    """
+    for name, marker in sorted(existing.items()):
+        if name in declared:
+            continue
+        log.append(
+            f"[undeclared] skills/{name} is vendored (from "
+            f"{marker.get('repo', '?')}) but no longer declared in "
+            f"{CATALOG_FILE.name}; remove it in a pull request if that is "
+            "intended"
+        )
+
+
+def commit_url(repo: str, commit: str) -> str:
+    return f"https://github.com/{repo}/commit/{commit}"
+
+
+def pr_title(updated: list[ImportResult]) -> str:
+    """Compose the pull request title for a run.
+
+    A single bumped skill — the common nightly case — reads
+    "Bump `<skill>` to `<short commit>`". No bumps means no pull request,
+    hence no title.
+    """
+    if not updated:
+        return ""
+    if len(updated) == 1:
+        result = updated[0]
+        return f"Bump `{result.folder}` to `{result.short_commit}`"
+    return f"Bump {len(updated)} federated skills"
+
+
+def pr_body(
+    updated: list[ImportResult],
+    unchanged: list[ImportResult],
+) -> str:
+    lines = [
+        "Automated federation refresh driven by `.github/federation.json`.",
+        "",
+        "Each source is tracked at the branch its entry names "
+        f"(`{branches.DEFAULT_BRANCH}` unless set), and a skill is re-vendored "
+        "only when the contents of its upstream folder change.",
+    ]
+    if updated:
+        lines += ["", "**Bumped**", ""]
+        for result in sorted(updated, key=lambda r: r.folder):
+            lines.append(
+                f"- `{result.folder}` to "
+                f"[`{result.short_commit}`]"
+                f"({commit_url(result.source.repo, result.commit)}) "
+                f"from `{result.source.repo}/{result.path}` "
+                f"on `{result.branch}`"
+                + (
+                    f" (newest `{result.source.branch}`)"
+                    if result.branch != result.source.branch
+                    else ""
+                )
+            )
+    omitted = [
+        (result, rel) for result in sorted(updated, key=lambda r: r.folder)
+        for rel in result.omitted
+    ]
+    if omitted:
+        lines += [
+            "",
+            f"**Not vendored** (over {MAX_FILE_BYTES // 1024} KB, left upstream)",
+            "",
+        ]
+        for result, rel in omitted:
+            lines.append(f"- `{result.path}/{rel}`")
+    if unchanged:
+        lines += ["", "**Unchanged**", ""]
+        for result in sorted(unchanged, key=lambda r: r.folder):
+            lines.append(f"- `{result.folder}`")
+    lines += [
+        "",
+        "Each vendored skill carries a `.federated.json` marker recording the "
+        "source repo, the tracked branch, the resolved commit, and the content "
+        "hash used for change detection.",
+    ]
+    return "\n".join(lines) + "\n"
+
+
+def build_summary(results: list[ImportResult]) -> dict:
+    """Machine-readable record of the run for the calling workflow."""
+    updated = [r for r in results if r.updated]
+    unchanged = [r for r in results if not r.updated]
+    return {
+        "changed": bool(updated),
+        "title": pr_title(updated),
+        "body": pr_body(updated, unchanged),
+        "updated": [
+            {
+                "skill": r.folder,
+                "repo": r.source.repo,
+                "path": r.path,
+                "branch": r.branch,
+                "commit": r.commit,
+                "short_commit": r.short_commit,
+            }
+            for r in sorted(updated, key=lambda r: r.folder)
+        ],
+        "unchanged": sorted(r.folder for r in unchanged),
+    }
+
+
+def main(argv: list[str] | None = None) -> int:
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument(
+        "--catalog",
+        type=Path,
+        default=CATALOG_FILE,
+        help=f"Path to the federation file (default: {CATALOG_FILE}).",
+    )
+    parser.add_argument(
+        "--check-catalog",
+        action="store_true",
+        help=(
+            "Validate the federation file and print what it declares, "
+            "without cloning anything."
+        ),
+    )
+    parser.add_argument(
+        "--only",
+        action="append",
+        metavar="SKILL",
+        help=(
+            "Vendor only the named skill folder (repeatable). Skills not "
+            "named here are left untouched."
+        ),
+    )
+    parser.add_argument(
+        "--list-skills",
+        action="store_true",
+        help=(
+            "Print the local names of the declared skills (after --only) as a "
+            "JSON array on stdout, without cloning anything. The workflow uses "
+            "it to fan out one job, and one pull request, per skill."
+        ),
+    )
+    parser.add_argument(
+        "--summary-json",
+        type=Path,
+        metavar="PATH",
+        help="Write a JSON summary of the run (including a PR title and body).",
+    )
+    args = parser.parse_args(argv)
+
+    sources = parse_federation(args.catalog)
+
+    if args.check_catalog:
+        seen: set[str] = set()
+        for source in sources:
+            for spec in source.skills:
+                if spec.dest_name in seen:
+                    raise ValueError(
+                        f"Skill name collision: {spec.dest_name!r} is declared "
+                        f"more than once in {args.catalog}."
+                    )
+                seen.add(spec.dest_name)
+                print(
+                    f"{source.repo}@{source.branch} {spec.path} "
+                    f"-> skills/{spec.dest_name}"
+                )
+        print("")
+        print(f"{args.catalog} is valid: {len(seen)} skill(s) declared.")
+        return 0
+
+    only = set(args.only or [])
+    if only:
+        known = {spec.dest_name for source in sources for spec in source.skills}
+        unknown = only - known
+        if unknown:
+            raise ValueError(
+                "--only names skill(s) not present in the catalog: "
+                + ", ".join(sorted(unknown))
+            )
+        for source in sources:
+            source.skills = [s for s in source.skills if s.dest_name in only]
+        sources = [source for source in sources if source.skills]
+
+    if args.list_skills:
+        names: list[str] = []
+        for source in sources:
+            for spec in source.skills:
+                if spec.dest_name in names:
+                    raise ValueError(
+                        f"Skill name collision: {spec.dest_name!r} is declared "
+                        f"more than once in {args.catalog}."
+                    )
+                names.append(spec.dest_name)
+        # Each per-skill run passes --only, which skips the undeclared report,
+        # so this is the one place it still gets made. It goes to stderr to
+        # keep stdout a single JSON document.
+        if not only:
+            undeclared: list[str] = []
+            report_undeclared(set(names), find_federated_skills(), undeclared)
+            for line in undeclared:
+                print(line, file=sys.stderr)
+        print(json.dumps(names))
+        return 0
+
+    log: list[str] = []
+    declared: set[str] = set()
+    all_results: list[ImportResult] = []
+
+    SKILLS_DIR.mkdir(exist_ok=True)
+    existing_federated = find_federated_skills()
+
+    for source in sources:
+        for spec in source.skills:
+            if spec.dest_name in declared:
+                raise ValueError(
+                    f"Skill name collision: {spec.dest_name!r} is declared by "
+                    f"more than one source in {args.catalog}."
+                )
+            declared.add(spec.dest_name)
+        all_results.extend(import_source(source, log))
+
+    # With --only the skills the caller didn't name are deliberately ignored,
+    # so they would all look undeclared; skip the report in that case.
+    if not only:
+        report_undeclared(declared, existing_federated, log)
+
+    for line in log:
+        print(line)
+
+    summary = build_summary(all_results)
+    if args.summary_json:
+        args.summary_json.parent.mkdir(parents=True, exist_ok=True)
+        args.summary_json.write_text(
+            json.dumps(summary, indent=2) + "\n", encoding="utf-8"
+        )
+
+    print("")
+    print(f"Bumped: {len(summary['updated'])} skill(s)")
+    print(f"Already up to date: {len(summary['unchanged'])} skill(s)")
+    if summary["title"]:
+        print(f"Pull request title: {summary['title']}")
+    return 0
+
+
+if __name__ == "__main__":
+    raise SystemExit(main())
Full technical diff · 201 changed fields

changed /files/.claude-plugin~1marketplace.json/sha256

BEFORE
"7f832b8a3c4898e1453f60b461b79fb8d4c0e8889d930e0daf12af3c1e2ff938"
AFTER
"ecff6eacb9367066be2b7dcbf31d962943a6d012b408265317d89f404678e064"

removed /files/.codex-plugin~1assets~1composer-icon.png

BEFORE
{
  "sha256": "671ee8519686294b03b4995bb3ba99045004bbccd328968bf38c30b3cc96c312",
  "size": 16453
}
AFTER
Field is absent

removed /files/.codex-plugin~1assets~1logo.png

BEFORE
{
  "sha256": "671ee8519686294b03b4995bb3ba99045004bbccd328968bf38c30b3cc96c312",
  "size": 16453
}
AFTER
Field is absent

changed /files/.codex-plugin~1plugin.json/sha256

BEFORE
"cbe68f54a64025845974c6d485a9b765a307f70548952b61be30b67e1835ac49"
AFTER
"08213eda069ee496a17c663b941ca997407d543a9a49b92aa983dabca172600b"

changed /files/.codex-plugin~1plugin.json/size

BEFORE
1566
AFTER
1476

changed /files/.cursor-plugin~1marketplace.json/sha256

BEFORE
"99532081705cd0bb6ede1c819eaeb90eacf1625bed16279cc13b4b6ad91e55a9"
AFTER
"bf12a600d18e0f2650c3a8aa0f6d75f499e2c9ab3d445f44661582d28e64c03a"

added /files/.gitattributes

BEFORE
Field was absent
AFTER
{
  "sha256": "32fb19ff90af0d69e2ddcd712a66d2df0c5221c0914e00ff90eb8049d5b1201f",
  "size": 133
}

added /files/.github~1ISSUE_TEMPLATE~1product-repo-approval.yml

BEFORE
Field was absent
AFTER
{
  "sha256": "220b3b7c26f7cc979b0b784b7134234f403db286824112aea60bfa06570a7730",
  "size": 1783
}

added /files/.github~1federation.json

BEFORE
Field was absent
AFTER
{
  "sha256": "510e70ad11ccf5a7d3a5004fe4222860dd195e2db4f5ca107c5cfb1bb089bf7c",
  "size": 2723
}

removed /files/.github~1lychee.toml

BEFORE
{
  "sha256": "d0d95d985f6e95069771a67ab688c968f17a64cbb62873205511defcb162783e",
  "size": 1101
}
AFTER
Field is absent

changed /files/.github~1scripts~1check.sh/sha256

BEFORE
"f856faf80697412117658bcd0b0958e761ef87ff0c0f751d090a54da3d94e8f2"
AFTER
"810ae94f028be37fd2344665ebe1ceaafe112385860f97c08568453fba467c6e"

changed /files/.github~1scripts~1check.sh/size

BEFORE
937
AFTER
2150

added /files/.github~1scripts~1federate_skills.py

BEFORE
Field was absent
AFTER
{
  "sha256": "2ef60b3b35453bf11ec1d1453fe08bb5739438fabc09d6f5bc5b6f027b86b8da",
  "size": 43413
}

added /files/.github~1scripts~1federation_branches.py

BEFORE
Field was absent
AFTER
{
  "sha256": "5d8794825673901f2e7c52bb555d04cccec7f1aa6ea647a118f7a45fdae1532c",
  "size": 3925
}

added /files/.github~1scripts~1federation_guard.py

BEFORE
Field was absent
AFTER
{
  "sha256": "445d12e584512c25c88af7d6d9bc02bcd4b5905f1438aae12b6419b6c9a34894",
  "size": 13262
}

changed /files/.github~1scripts~1generate_codex_plugin.py/sha256

BEFORE
"8f05ffceb2290747ee8b8290a45b8bbbf6b85c349e81b07779bc3eba6f8dee31"
AFTER
"bdadff31480c5ce8f236b994cf67fb0dca5ac2745db52c43da377d02d8faa7e1"

changed /files/.github~1scripts~1generate_codex_plugin.py/size

BEFORE
10540
AFTER
10642

removed /files/.github~1scripts~1import_external_skills.py

BEFORE
{
  "sha256": "7a5951a4ea66edf60505c9a9755e68dcff69eccac9400e07d28ed5aa69b69e25",
  "size": 26302
}
AFTER
Field is absent

added /files/.github~1scripts~1record_skill_owner.py

BEFORE
Field was absent
AFTER
{
  "sha256": "e4fcbaa783588fe4c6120b3fa2d146d30a1be19580b0ed088923e8cf217df0f3",
  "size": 5253
}

removed /files/.github~1scripts~1select_evals.py

BEFORE
{
  "sha256": "8a03b1967e6fd47b66cca3af879446a9bdfcb8f05957c32541c372cc0793b1d9",
  "size": 7714
}
AFTER
Field is absent

removed /files/.github~1scripts~1sources.yml

BEFORE
{
  "sha256": "2211ba8f95f807c8faf5dacd4914192204483785a340d3da83d961dc03261017",
  "size": 2148
}
AFTER
Field is absent

added /files/.github~1scripts~1test_cli_install.py

BEFORE
Field was absent
AFTER
{
  "sha256": "90c76c0dbf0ed4f8148fcc751433c9634047e10fb97308b502f135c7ed6a4c35",
  "size": 18989
}

added /files/.github~1scripts~1test_federate_skills.py

BEFORE
Field was absent
AFTER
{
  "sha256": "08de2a560c7e6fb940348890d060dc95ffaeec584c9df0c8202e5a76b645c736",
  "size": 24599
}

added /files/.github~1scripts~1test_federation_guard.py

BEFORE
Field was absent
AFTER
{
  "sha256": "5154a007094db1dd247c3bf77af0037841a638796d0ed5baa98be073fd58a88e",
  "size": 25059
}

added /files/.github~1scripts~1test_record_skill_owner.py

BEFORE
Field was absent
AFTER
{
  "sha256": "b0d15aa79459e69b9f69c5f9f68ba43904891eaecd770b1cd9265e5794d14059",
  "size": 3091
}

added /files/.github~1scripts~1validate_marketplace.py

BEFORE
Field was absent
AFTER
{
  "sha256": "1e3461cfc7871193230df887c43bb7ad19cfd425dcf45b9ed50dd22bdbf31933",
  "size": 7945
}

removed /files/.github~1scripts~1validate_skills.py

BEFORE
{
  "sha256": "612a81828d27b0851b0524c5470f320b407d6bafdbb9838f18541fa1fbd57e4b",
  "size": 16160
}
AFTER
Field is absent

added /files/.github~1skill_owners.json

BEFORE
Field was absent
AFTER
{
  "sha256": "65b4be058acbd060b77491b8d8f12607a439550470d75e000c40ec1490e533d7",
  "size": 1080
}

added /files/.github~1workflows~1cli-install.yml

BEFORE
Field was absent
AFTER
{
  "sha256": "82ec9f6ea26a7f7ee8641b01936216588ec99808bc6b2c4cdcb420826a4685ec",
  "size": 5182
}

changed /files/.github~1workflows~1evals.yml/sha256

BEFORE
"29789a53e3fc7d6053db18343a839a518b4fdeec59606d4a6b85f53733f34244"
AFTER
"effc21cabb537736a3b2d7daa48d164015b0f6ef09bb144f5a2ee231fbc9179a"

changed /files/.github~1workflows~1evals.yml/size

BEFORE
14467
AFTER
9130

removed /files/.github~1workflows~1external-reference-check.yml

BEFORE
{
  "sha256": "12e227c00d3f5e4b4a2b8f7b9b19c007d931926718f88c4ad4448721f177839b",
  "size": 5664
}
AFTER
Field is absent

added /files/.github~1workflows~1federate-skills.yml

BEFORE
Field was absent
AFTER
{
  "sha256": "2be1f76b61f161bd71fc020eca76270920f76784a075df49ddba00be9dc1f5ed",
  "size": 7127
}

added /files/.github~1workflows~1federation-guard.yml

BEFORE
Field was absent
AFTER
{
  "sha256": "7a188c53b486f4b543dacb7b41181432824c63766ac7ef046db5798762b671c8",
  "size": 12073
}

removed /files/.github~1workflows~1import-external-skills.yml

BEFORE
{
  "sha256": "4d778a0955e7ca14ea3a71c2c4ab063a86a49d90009c7136b74d9ebc5932c110",
  "size": 3676
}
AFTER
Field is absent

added /files/.github~1workflows~1product-repo-approval.yml

BEFORE
Field was absent
AFTER
{
  "sha256": "e44ad4950dc1952a16ea276993e6b32ff715e53fe534ae61870b1a12b0adcaf4",
  "size": 17815
}

changed /files/.github~1workflows~1validate.yml/sha256

BEFORE
"af6371036fcd8fad65dbbcdc8a295345e3e7ff3435de78533b2384484fa89ffa"
AFTER
"9b1c6c5d4c74f3a03452f61be6dc2e2c18265d859a1c1994f4eca5f3ea421797"

changed /files/.github~1workflows~1validate.yml/size

BEFORE
5443
AFTER
3876

changed /files/.gitignore/sha256

BEFORE
"17adfe38c52e6903e14702363446bf175fbedd5ff75572c4c8f36e6a7a62f7e2"
AFTER
"23ba88c5c1057a44a21f861c2e41592c33ef5135f9aa0138f6627e61a0b12c54"

changed /files/.gitignore/size

BEFORE
296
AFTER
321

changed /files/CONTRIBUTING.md/sha256

BEFORE
"745800171cd5905772a64cea2420c1ed3bd5dfe571e5822b725d7f053652aa04"
AFTER
"68012be70fc7e3e1a13b596c8d0f2773ac6b2fc419202054ada3464f284858bf"

changed /files/CONTRIBUTING.md/size

BEFORE
4434
AFTER
7769

changed /files/README.md/sha256

BEFORE
"c6580828d9772b17aa14fcb5b5689e11bdb3f7603dbd69c6c43abe9cd003ac94"
AFTER
"3646d3917859683b560e075d649312b59cd5f9976179476f80ed867d7e38fd8b"

changed /files/README.md/size

BEFORE
12647
AFTER
16789

changed /files/docs~1evals.md/sha256

BEFORE
"2cbdc16348e2e44f54bbfc001a6f39daf02c180110a9b506b94f541ad2c77604"
AFTER
"740024dce4ded4eca6ba9a2639d958ced6b4c4dde95b96b8ee5b529d814ddd11"

changed /files/docs~1evals.md/size

BEFORE
7394
AFTER
8944

added /files/docs~1rocm-docs~1.readthedocs.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "0b25e1e87c43018ea2c41b95d83a3bc470575c7fc6a674be3f38ec18f4916af0",
  "size": 194
}

changed /files/docs~1rocm-docs~1catalog.md/sha256

BEFORE
"c8b8bc4d446513559327b425023aa455ae7f42b73cb9e5d1783c5031b6675d6a"
AFTER
"c78dbcfa660c20c85ead1b7e4feb0a9fbe1f897e26e7dc34b36c9905b9487fbd"

changed /files/docs~1rocm-docs~1catalog.md/size

BEFORE
117
AFTER
220

changed /files/docs~1rocm-docs~1conf.py/sha256

BEFORE
"775fd07c2cb9b1af57ac92c45709ec0174c1f41b60d1c86876e9f1e216214844"
AFTER
"6823763f122edb4ee944fedb99d2f5d9a54ae373a69b6224bf7137f05f113e94"

changed /files/docs~1rocm-docs~1conf.py/size

BEFORE
962
AFTER
1040

changed /files/docs~1rocm-docs~1sphinx~1_toc.yml.in/sha256

BEFORE
"e1db7ec3950c5e93eefd8a36517b2e063b9f894ce91b591f0b631b5546946ebc"
AFTER
"fdb38e44d1dbd4c5b9ee67e2a09505372b185e2a8f1c765aab7537e6fc604eb8"

changed /files/docs~1rocm-docs~1sphinx~1_toc.yml.in/size

BEFORE
793
AFTER
853

changed /files/docs~1rocm-docs~1walkthroughs~1hyperloom-workload-optimizer.md/sha256

BEFORE
"dc1c23b13b0116b4798e2b7709e26b7d9b8164179b0c37b50ce2d1c6656876fc"
AFTER
"f1a5994737fbbc182ac3e04e9b2efe77b238639934580433104639649b29af19"

changed /files/docs~1rocm-docs~1walkthroughs~1index.md/sha256

BEFORE
"b2a5a3c18871b0f7ce38ff596dce66f63ddd07e79bae1b38f6dfc30f9e896d8e"
AFTER
"514e7be9c23e861f6b6737d92fec435217007488eac421f19c79bca627677d15"

changed /files/docs~1rocm-docs~1walkthroughs~1index.md/size

BEFORE
1136
AFTER
1263

changed /files/docs~1rocm-docs~1walkthroughs~1lemonade-router-builder.md/sha256

BEFORE
"5c85f2dc23f310b86862632e688d52aa0c39f6f5fbe36c1cc91c561eae8e71c8"
AFTER
"35b9ee5d76ab78cace2ff5605ba57f65cdd9b3c6c6fa8a95e78000fd32ddd3ca"

changed /files/docs~1rocm-docs~1walkthroughs~1local-ai-app-integration.md/sha256

BEFORE
"5285a94094cc052f70676fef60b3d728d7f5607ea0b64e161ec20081cebaa806"
AFTER
"b06bdabe4c883d007fd09a85f908e0085a5cb1bced4540d7ce8d2a3bffb41458"

changed /files/docs~1rocm-docs~1walkthroughs~1local-ai-use.md/sha256

BEFORE
"618c90c57a1d97f6bb853ec3fe27f822fabd489789ec739fcc52de9414fa3a30"
AFTER
"5d3fcc3c5f68654553ca2482ccbdba117687ae1236356549e44f524d032bc073"

changed /files/docs~1rocm-docs~1walkthroughs~1magpie-kernel-evaluator.md/sha256

BEFORE
"95d66f8a702b40a41521a7ee8d7802d1be86781cf098612e3295d8f88cb5ccf1"
AFTER
"9cc9cee39efdf1fdc5f7ae520748703e2a93461fabf6b85b1399e8f025b70ffc"

changed /files/docs~1rocm-docs~1walkthroughs~1serving-llms-on-epyc.md/sha256

BEFORE
"b77e6af4c8296ae094fd776d99a7abb7ead9617f87ee6e61370416170607da7b"
AFTER
"319406b5c0d79523752796b49fb6a38a936b52b366b2316ba9c58bf5f0d97472"

added /files/docs~1rocm-docs~1walkthroughs~1serving-llms-on-instinct.md

BEFORE
Field was absent
AFTER
{
  "sha256": "37a8e6f675619b55197a1eb222b31afc64d3c42f532f6800176f553c06f6a0c1",
  "size": 165
}

changed /files/docs~1rocm-docs~1walkthroughs~1tracelens-analysis-orchestrator.md/sha256

BEFORE
"6eac20307ecba15228e8a02ed4b6c756dc3aa42b12031237f3daa09ed36636a2"
AFTER
"6e9579a4a41d640856e3fa5925b777a44b8226a4f5779aab7f8932aaf136e124"

changed /files/docs~1skill-requirements.md/sha256

BEFORE
"52e1025107953ed59beaee932e6ddaf75248135e753cc5e26d5fe2589e495019"
AFTER
"c1615fa3f02e26f3308cc89814f37519c4216ed657ee52ed503766263575adc4"

changed /files/docs~1skill-requirements.md/size

BEFORE
5490
AFTER
5426

removed /files/eval~1TEMPLATE.json

BEFORE
{
  "sha256": "7c23307f42a539df48cbca732247ec4346a3cf26eb2c15b233616e70fe9f36a1",
  "size": 1419
}
AFTER
Field is absent

removed /files/eval~1agent.py

BEFORE
{
  "sha256": "b4db79ebf469c69b2ab10e26079f0749831064a77f910bc8c9f8198e9939f0c6",
  "size": 19551
}
AFTER
Field is absent

removed /files/eval~1claude_eval.py

BEFORE
{
  "sha256": "16478965a9bd26144046ab41cc27ea0151640d13280e9b75697cb752fc724365",
  "size": 10951
}
AFTER
Field is absent

removed /files/eval~1compare_skill.py

BEFORE
{
  "sha256": "1ad409a61f921fc765bddabd085a0da2959d0dd76b93fbb784e7e3c8da2d13d4",
  "size": 10875
}
AFTER
Field is absent

removed /files/eval~1datasets.py

BEFORE
{
  "sha256": "26a787cf74c31012b5c69c139f1f08ddcc5a279202934da8d22bab51648ce893",
  "size": 23853
}
AFTER
Field is absent

removed /files/eval~1negatives.json

BEFORE
{
  "sha256": "987fded3e0bfa1c813e911265a379b124c343bbe738d78a13d76ce23e3555dfc",
  "size": 1742
}
AFTER
Field is absent

removed /files/eval~1routing.py

BEFORE
{
  "sha256": "248ecc6dbfe25fbcc5a8d6d15b1e166b99db0c5c25a06bee119d9eead35c084a",
  "size": 32444
}
AFTER
Field is absent

removed /files/eval~1run_evals.py

BEFORE
{
  "sha256": "42a05aa6c1fe763d422f0cf3dda649a1a922741a3d3eaba5f092045317c03780",
  "size": 22693
}
AFTER
Field is absent

removed /files/eval~1schema~1evals.schema.json

BEFORE
{
  "sha256": "30cd9fcf58ba8db6bf729c586f1a568c4ca0263cb8eb0c8af0c288023d1c4125",
  "size": 5883
}
AFTER
Field is absent

removed /files/eval~1schema~1machine.schema.json

BEFORE
{
  "sha256": "2692350fd5ccd4f81060b2fb85ce8aa8ed802180fa65bd9adccdb094b1f33f53",
  "size": 1724
}
AFTER
Field is absent

removed /files/eval~1test_evals.py

BEFORE
{
  "sha256": "f62ae5f0167886d4bc6b1580f109873826e38ef8cf7d522d7539efe755fb4a1d",
  "size": 34381
}
AFTER
Field is absent

changed /files/plugin-metadata.json/sha256

BEFORE
"72872b8d3368f7a3755aebed92c4e20d7c65b8977c3a690bb63aba36b9a60d3d"
AFTER
"524e2cefd2e0492ce6ac30b7ca474598e6f41a8664757055600a239114da9e82"

added /files/skills~1hyperloom-workload-optimizer~1.federated.json

BEFORE
Field was absent
AFTER
{
  "sha256": "3125107b52b956b23d76bc0bac1c2b7e0c3b3e27e4cea97057808958283cbf47",
  "size": 345
}

changed /files/skills~1hyperloom-workload-optimizer~1SKILL.md/sha256

BEFORE
"8e65e305b0a6766068f9e9aab72e9fa5a1fc6f97e3beeba530838889fe68190a"
AFTER
"baf471f98d4339b735613586ca6c37e7b73ef42e58f35f1b2990f97b407c0f96"

changed /files/skills~1hyperloom-workload-optimizer~1SKILL.md/size

BEFORE
20940
AFTER
6765

changed /files/skills~1hyperloom-workload-optimizer~1evals~1evals.json/sha256

BEFORE
"0ce9f8c1dac572564eca557c698374137049064d28c93f82e77bf830ea3b21a8"
AFTER
"a51d534fb04f6128282fe30709ecaeee6c504524e3ae4ae5778cee38459291b6"

changed /files/skills~1hyperloom-workload-optimizer~1evals~1evals.json/size

BEFORE
5089
AFTER
4360

changed /files/skills~1hyperloom-workload-optimizer~1evals~1machine.yml/sha256

BEFORE
"a6adf5df60b3c4ce55aaffeb376e517b7e462316d61f255ec60ee4669d2a4411"
AFTER
"3a53df46087df6eef3a243aab68875ab2f67400abf1838b61d5a0420e951f29c"

changed /files/skills~1hyperloom-workload-optimizer~1evals~1machine.yml/size

BEFORE
22
AFTER
328

removed /files/skills~1hyperloom-workload-optimizer~1reference.md

BEFORE
{
  "sha256": "2e1aad7b8726de05766a83b3af787e4624b5d0c3ffe54c04c5e2172597c28168",
  "size": 5328
}
AFTER
Field is absent

removed /files/skills~1hyperloom-workload-optimizer~1scripts~1_env.sh

BEFORE
{
  "sha256": "8a9cd34a91d4b920387a87d9ba8af9f2735b408585257b3f89e893dc54bdc1ee",
  "size": 2349
}
AFTER
Field is absent

removed /files/skills~1hyperloom-workload-optimizer~1scripts~1launch.sh

BEFORE
{
  "sha256": "25b44c1705334e64ccba7699db7b3169e59bcf3cd5463c29606a544d221ad730",
  "size": 1846
}
AFTER
Field is absent

removed /files/skills~1hyperloom-workload-optimizer~1scripts~1launch_health.sh

BEFORE
{
  "sha256": "245ec3714f2762a81a2a300c72f0ad8ced8d4150ec46e51db0a6b7c111a8806d",
  "size": 2052
}
AFTER
Field is absent

removed /files/skills~1hyperloom-workload-optimizer~1scripts~1preflight.py

BEFORE
{
  "sha256": "b103c21597b60f29ccf7e9acd2870b79f22b6af2cdd3e3d3daf1422825871292",
  "size": 9826
}
AFTER
Field is absent

removed /files/skills~1hyperloom-workload-optimizer~1scripts~1resume.sh

BEFORE
{
  "sha256": "72f827ffa0f5f93ab5493d26c870adcc7d37eb88fbd87c69d2d41e6c104c0357",
  "size": 1862
}
AFTER
Field is absent

removed /files/skills~1hyperloom-workload-optimizer~1scripts~1tests~1test_launch_flow.sh

BEFORE
{
  "sha256": "13a7418c0521e9dbfc5e93c14b5c0861323c346ba2f08d16427c5c0c27969bd6",
  "size": 9045
}
AFTER
Field is absent

removed /files/skills~1hyperloom-workload-optimizer~1scripts~1tests~1test_preflight.py

BEFORE
{
  "sha256": "9189e58899cc317c1f95f9e7bdae497b710045632fbcd3683ff1380c4a36029b",
  "size": 6609
}
AFTER
Field is absent

removed /files/skills~1hyperloom-workload-optimizer~1setup.md

BEFORE
{
  "sha256": "620fddf6655f0ac3ed52c5295b4fad4d1f330358a79e8fe35a59d127a88237af",
  "size": 5504
}
AFTER
Field is absent

changed /files/skills~1hyperloom-workload-optimizer~1skill-card.md/sha256

BEFORE
"259fe58a2b09b71a78cf607efe7b5243d513fa951620f53ba8f729a456ab17a0"
AFTER
"ecaa026f89d7b902dd52c4b796a59b7c5ac84ad803df3d22dd43f9f9d32c338a"

changed /files/skills~1hyperloom-workload-optimizer~1skill-card.md/size

BEFORE
203
AFTER
464

added /files/skills~1local-ai-app-integration~1.federated.json

BEFORE
Field was absent
AFTER
{
  "sha256": "a738ed99bea74d67f46c4fca9f5d9235ccc847e90dd859337c011eebb9002ff0",
  "size": 343
}

added /files/skills~1local-ai-use~1.federated.json

BEFORE
Field was absent
AFTER
{
  "sha256": "3a99dc14087ce2d7a0372f94262469bc849c1fd1dda1e194cbf5dc1509db63ee",
  "size": 331
}

changed /files/skills~1local-ai-use~1SKILL.md/sha256

BEFORE
"61f11302b346130f8a676f4ff3d28734857beb8a09362d797fc43ffc9b014755"
AFTER
"b93029a8918934626a9ce5ec8286b244022ab92560389ec188d4a612ec6dd3f9"

changed /files/skills~1local-ai-use~1SKILL.md/size

BEFORE
18207
AFTER
20024

changed /files/skills~1local-ai-use~1reference.md/sha256

BEFORE
"8b93b66b50f2fd0ba92181c846457618460e344eb3c48363055d10697223e976"
AFTER
"fdbd77baada8f522bd0d540e385d394f476c351307cc7dd3d2daf41dcb7a0a78"

changed /files/skills~1local-ai-use~1reference.md/size

BEFORE
9521
AFTER
9612

changed /files/skills~1local-ai-use~1scripts~1setup_local_ai.py/sha256

BEFORE
"7671a929c91974ed56704b70a44bce9102e8150937e6e743b798d421efb49825"
AFTER
"6f409c54e923e31e705334d395bd72fa16bca8ca67ea1564c087cf1d7bf21c93"

changed /files/skills~1local-ai-use~1scripts~1setup_local_ai.py/size

BEFORE
24065
AFTER
27402

changed /files/skills~1serving-llms-on-instinct~1evals~1machine.yml/sha256

BEFORE
"a6adf5df60b3c4ce55aaffeb376e517b7e462316d61f255ec60ee4669d2a4411"
AFTER
"3a53df46087df6eef3a243aab68875ab2f67400abf1838b61d5a0420e951f29c"

changed /files/skills~1serving-llms-on-instinct~1evals~1machine.yml/size

BEFORE
22
AFTER
328

changed /files/skills~1tracelens-analysis-orchestrator~1.federated.json/sha256

BEFORE
"e81e6ef6a33f51a7bb80e1e4d388722e4625aae1ff5084e0fb46fa89fc00c805"
AFTER
"3c0e9aa5bc0bcf548d35b7c989a1e219d81325597b8a89a751bc076b4f464bb1"

changed /files/skills~1tracelens-analysis-orchestrator~1.federated.json/size

BEFORE
268
AFTER
354

changed /files/skills~1tracelens-analysis-orchestrator~1SKILL.md/sha256

BEFORE
"fd7a3b06e754b62a45c03402674ce02b0b55af4a46112d98d25155fe57911e75"
AFTER
"b9318e97ccc875ce24dc6cff0bfe7cd1040de4f67299fef68bea707f226de279"

changed /files/skills~1tracelens-analysis-orchestrator~1SKILL.md/size

BEFORE
2908
AFTER
3204

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1convolution-analyzer.md/sha256

BEFORE
"f591091c5fd42aac6a2c5e1c015b2fb760d568c5bb8bbe7fd31e8b97f4957f91"
AFTER
"8cc3bf6f914dc7abe9095f861fe2ab8eed1fc87da270bff1863231ee746f5f7d"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1convolution-analyzer.md/size

BEFORE
7913
AFTER
7916

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1cpu-idle-analyzer.md/sha256

BEFORE
"a2f8681acc46a02b508c222687f2d874bf079e3b884b6a1ce4285143bd235889"
AFTER
"b7653afd551663c34f6012859ad35b59f56aa06424a77312d9ff4ef1a8b5873e"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1cpu-idle-analyzer.md/size

BEFORE
6390
AFTER
6408

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1elementwise-analyzer.md/sha256

BEFORE
"409c5a081f06fcf30a79f6f8d95601ab1de3782cf54c5b48867713c04f72ef83"
AFTER
"3c6967c9ef0b39adbd782e69bd331efeaf87bccfc1727834297a83a9ee8c2b7a"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1elementwise-analyzer.md/size

BEFORE
7238
AFTER
7250

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1gemm-analyzer.md/sha256

BEFORE
"9b6e1c88c16fcf3208b83822ece1eb3d22f596a54a9197f14b54008426af874d"
AFTER
"31fdbbfe33d06a6753cd5736b7e5644c79a8c0572ee04734ed68c55aa4208b4e"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1gemm-analyzer.md/size

BEFORE
6409
AFTER
6412

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1generic-op-analyzer.md/sha256

BEFORE
"d13a912df7c83d9333d1d352836b3e6155dabeb0fb557c89f1d700a09cc71175"
AFTER
"f60442c6bc93172f9d8860840b352d1c6f2b5fd58cbf171f42d0c4c55e4c3673"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1generic-op-analyzer.md/size

BEFORE
9727
AFTER
9730

added /files/skills~1tracelens-analysis-orchestrator~1agents~1kernel-coherence-agent.md

BEFORE
Field was absent
AFTER
{
  "sha256": "badd2f7a2843eadd972c6660a08d8ecf17b21f5dfb5b20a01309650ec0be0556",
  "size": 8396
}

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1kernel-fusion-analyzer.md/sha256

BEFORE
"bd0741b28696420c5c7358680be334b789c48c4f4847d2d3c10a096765e2047e"
AFTER
"434d4c8fc215de099e5f3a4583a87d95d1a5de5c508ec915be282406ec42beab"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1kernel-fusion-analyzer.md/size

BEFORE
15145
AFTER
15156

added /files/skills~1tracelens-analysis-orchestrator~1agents~1kernel-stem-preprocessing-agent.md

BEFORE
Field was absent
AFTER
{
  "sha256": "6345bdc9428c516e1257581831c1880cc849b94a887c88a02a1a9e9a03bf7024",
  "size": 5839
}

added /files/skills~1tracelens-analysis-orchestrator~1agents~1kernel-unification-agent.md

BEFORE
Field was absent
AFTER
{
  "sha256": "05b4375c4bce688781f36ac52229369185db1315e71a10d7552eedaddb0f04b9",
  "size": 6567
}

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1model-identification-agent.md/sha256

BEFORE
"859bb2b05b602589b5276ba5a38fe85be7d812852eb739d49391588baf5e051b"
AFTER
"48847d351deb5eabf07abfd1a7dbd78d7988e9a247171e56a77ae748fbf975f7"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1model-identification-agent.md/size

BEFORE
4364
AFTER
4290

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1moe-analyzer.md/sha256

BEFORE
"569c3f84f659f9ad8106a08945b94f9e402e8563abc778f21f4ed1a7ce781b42"
AFTER
"c0429f06af501d69f523edde1e4005d1af6c1181c88e2cb50c98b32bb3760523"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1moe-analyzer.md/size

BEFORE
8649
AFTER
8665

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1multi-kernel-analyzer.md/sha256

BEFORE
"aba51d8438f58504b7091f98d8ba806d5289f9adb1592887dd1907f4cba5aa25"
AFTER
"d754262913ac34cc64ff1b721b5cb472bfc70bbbb1111f90810db0401181c270"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1multi-kernel-analyzer.md/size

BEFORE
12126
AFTER
11732

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1norm-analyzer.md/sha256

BEFORE
"3f030eb5531823f0ceec4a663a90e8a7bebded03b8196438a64fd3f9fa3c6c95"
AFTER
"b79d2f5330954bed595797e4ab17698811298906c9787c785a97bc64b47b1e10"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1norm-analyzer.md/size

BEFORE
6873
AFTER
6876

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1reduce-analyzer.md/sha256

BEFORE
"9b6cd514c04fed1e4fcd61d7fcc1c5de0b4fe6126c61752c6278bf569f6d4b46"
AFTER
"acfe74c2774e7191e24cf1e53d9f0d999d2cda29f89b8cdfc4156508abe32fec"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1reduce-analyzer.md/size

BEFORE
6453
AFTER
6456

added /files/skills~1tracelens-analysis-orchestrator~1agents~1roofline-augment-agent.md

BEFORE
Field was absent
AFTER
{
  "sha256": "55950391e4b01f8b067cfa1fe02b4791b28298017a1b0caf4b43f4c7f28c8cbe",
  "size": 6281
}

added /files/skills~1tracelens-analysis-orchestrator~1agents~1semantic-comparison-agent.md

BEFORE
Field was absent
AFTER
{
  "sha256": "21257271821dd3120654eef77a6d3f4ffbe17a34a28032465999947b1b4595ac",
  "size": 12670
}

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1triton-analyzer.md/sha256

BEFORE
"81efc56da128703f14944acb7e82e7d543d200d2c7dfbcf0317859c39a0451a5"
AFTER
"1092c143c9b09e345a40babee3a07630262e9a097f82dca1ae699b7d2ba49693"

changed /files/skills~1tracelens-analysis-orchestrator~1agents~1triton-analyzer.md/size

BEFORE
7013
AFTER
7016

added /files/skills~1tracelens-analysis-orchestrator~1evals~1.gitignore

BEFORE
Field was absent
AFTER
{
  "sha256": "b0cfa8719305501babda5086ca4152e60c3b9f860eb9d4410697ae0190d3fdc1",
  "size": 266
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1EVAL_RUBRICS.md

BEFORE
Field was absent
AFTER
{
  "sha256": "4a59f845107074f04424685cdbd25d739aa542786e2869db5123a4cca3b2364a",
  "size": 17847
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1README.md

BEFORE
Field was absent
AFTER
{
  "sha256": "86aafa4acbf14c2d9c49b94240f18f283116e356a7737ed7140c387be44ad0c6",
  "size": 19259
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1analysis_tests~1combined_traces_comparative.csv

BEFORE
Field was absent
AFTER
{
  "sha256": "5174580a890f63aa283e4e2f91a09916967acfe6438c2b87c8d7b8b8752ea9cb",
  "size": 5191
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1analysis_tests~1combined_traces_standalone.csv

BEFORE
Field was absent
AFTER
{
  "sha256": "1cd59fd5d63d6ef8f0bf7eb2d3423613831f63cca6210b763565832d04362168",
  "size": 10541
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_scripts~1generate_ref.sh

BEFORE
Field was absent
AFTER
{
  "sha256": "49928a54ceb0b9313672aeb283ca6e30f0d480c3288899a3a898134278351828",
  "size": 14339
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_scripts~1kill_eval_jobs.sh

BEFORE
Field was absent
AFTER
{
  "sha256": "917707fe6789c0bab104315fbb2e63d1aa86295404f8067c9b1d1149f2b1ca3d",
  "size": 4127
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_scripts~1pack_test_archives.sh

BEFORE
Field was absent
AFTER
{
  "sha256": "176bfd4fee136941a2cfa269a96e7919e95ff2f3ab75dfbfd62cd7f7cd3a32e7",
  "size": 4732
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_scripts~1run_pi_analysis_in_docker.sh

BEFORE
Field was absent
AFTER
{
  "sha256": "58b8b6c37c6b4c164930babb739e4e41ec0d4f7cf0d220253f2b089703a2ba90",
  "size": 20031
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_scripts~1run_repeatability_parallel.sh

BEFORE
Field was absent
AFTER
{
  "sha256": "025077e3012383dd49d411d13fa0de3c8431f8964ae7b55b6716a07b29a94927",
  "size": 24915
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_utils~1aggregate_repeatability.py

BEFORE
Field was absent
AFTER
{
  "sha256": "e91d8256564f846c74e7c890a9056507b3bbe3d5e45d6c0ac2d98072000c9411",
  "size": 24663
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_utils~1compare_lca_partitions.py

BEFORE
Field was absent
AFTER
{
  "sha256": "fdae0d19985f7f94e5b13dc767147d2353a1738ae08568e2f6e1f3bb72b2c728",
  "size": 16624
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_utils~1manual_eval_checklist.md

BEFORE
Field was absent
AFTER
{
  "sha256": "4caddfad1cb49330a6802b21f952a22194ad5a9fc9fba5df2b292b3e9d1adc8b",
  "size": 3436
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_utils~1merge_results.py

BEFORE
Field was absent
AFTER
{
  "sha256": "cffbe981a673a15363d52e7600966d55e9fcca5cc5e47d30678bb4ac6d22e2d9",
  "size": 3023
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_utils~1quality_scripted_evals.py

BEFORE
Field was absent
AFTER
{
  "sha256": "e9468c6d765b9e624b111261e8e5a6bd5fbc7c657fb7e822b61eaeac550c33f4",
  "size": 8773
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_utils~1report_section_rules.yaml

BEFORE
Field was absent
AFTER
{
  "sha256": "762e4871f915039db287187baddf86a439b13d3a8265176cc59575a7724b6274",
  "size": 3890
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1eval_utils~1workflow_scripted_evals.py

BEFORE
Field was absent
AFTER
{
  "sha256": "8476ac44b63a2e82f97cd94a0e4fa7212c78546fde133324f025f50c625960aa",
  "size": 54560
}

changed /files/skills~1tracelens-analysis-orchestrator~1evals~1evals.json/sha256

BEFORE
"e3632251b7110085aa1e83e03d6a4476b2998761a1df40e9f25f0fafce1223b1"
AFTER
"2e4823156d3ac31b0ef8b02060af6d63e63f1e96cb864bd2fee295b6254bbf80"

changed /files/skills~1tracelens-analysis-orchestrator~1evals~1evals.json/size

BEFORE
2438
AFTER
3133

removed /files/skills~1tracelens-analysis-orchestrator~1evals~1hooks.py

BEFORE
{
  "sha256": "1ac080fab37c6fb4bcd53b3a8ed24140cd98f77fb463b1ef845a97a2a98befd0",
  "size": 6503
}
AFTER
Field is absent

changed /files/skills~1tracelens-analysis-orchestrator~1evals~1machine.yml/sha256

BEFORE
"adf8e12371384a0f44b745771a1b69ffcfa6756bc37ee8aa94654751434ca621"
AFTER
"84c1fba8ef08613c98f8bfa6c4ce182ef5bb6019c0a21ab8272648043e1c4fa6"

changed /files/skills~1tracelens-analysis-orchestrator~1evals~1machine.yml/size

BEFORE
12
AFTER
285

added /files/skills~1tracelens-analysis-orchestrator~1evals~1partial_tests~1README.md

BEFORE
Field was absent
AFTER
{
  "sha256": "b735f9b94ec8542f0ddc807bf187e0f595dd47a28c0ad1043ea5521068d233e4",
  "size": 5567
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1partial_tests~1eval_utils~1semantic_partition_scripted_evals.py

BEFORE
Field was absent
AFTER
{
  "sha256": "15f71e37729f93eb9bd6d11f4f18d7c57ec5de96f47e665fd24ad66e440a134f",
  "size": 5924
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1partial_tests~1eval_utils~1semantic_purity_aggregate.py

BEFORE
Field was absent
AFTER
{
  "sha256": "c63439afe74897b25e0644107857ce477ee1e656ad401d0faa1ed24a1b57b326",
  "size": 9319
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1partial_tests~1generate_gold_ref.sh

BEFORE
Field was absent
AFTER
{
  "sha256": "49ffac8367e56ccf8c38665c80d14ad7a59fb2da35f9ee7e1568c238f41535b5",
  "size": 4232
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1partial_tests~1partial_test_cases.csv

BEFORE
Field was absent
AFTER
{
  "sha256": "15e3865508af1f9758289d7b05924218dd8db9729f32dc862915243f231aac24",
  "size": 1044
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1partial_tests~1run_partial_tests.sh

BEFORE
Field was absent
AFTER
{
  "sha256": "2f25a3575f6bd1c816589ceacc23ac9936e37d750cb0ae8f72daf09481d58fd5",
  "size": 7962
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1skills~1eval-post-processing~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "c7881b49cbcff71ca2b76683e01dfc7db669011b4309fb30987d8dc15187f880",
  "size": 1693
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1skills~1eval-post-processing~1reference.md

BEFORE
Field was absent
AFTER
{
  "sha256": "4c81c6a300eb76a6c4d6b25aa1af55cc67f5064dbe9913e530735c1a0a151bf4",
  "size": 14842
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1skills~1eval-post-processing~1run_post_processing.py

BEFORE
Field was absent
AFTER
{
  "sha256": "de7f72c9042776648a11d91ec0aba61e25f80315b2098125d83c44604be55014",
  "size": 35336
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1skills~1quality-llm-eval~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "c659991834b66caddec1d7f84f4d89b63d40acf28e1ecdc346a524099b682e43",
  "size": 1007
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1skills~1quality-llm-eval~1reference.md

BEFORE
Field was absent
AFTER
{
  "sha256": "6a96ff87a4c722c9ad6f26a67295ba4f8133b63fb9cd6d9fcc69e568ebfd9e38",
  "size": 6498
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1skills~1workflow-llm-eval~1SKILL.md

BEFORE
Field was absent
AFTER
{
  "sha256": "4290e389d287146fd9a5647b3bf7f1bc0ca5d2bc2a4cbd4936905bf2ad5e0e27",
  "size": 960
}

added /files/skills~1tracelens-analysis-orchestrator~1evals~1skills~1workflow-llm-eval~1reference.md

BEFORE
Field was absent
AFTER
{
  "sha256": "7d985ec98f2e1cef4ab7e2953ed66499808fbf8402b73761b0f8c09147249200",
  "size": 2548
}

changed /files/skills~1tracelens-analysis-orchestrator~1reference.md/sha256

BEFORE
"5c28b5be38da8baacf1588502470caf83e3c7f1a1113257606eed243bd052933"
AFTER
"1aa42df8d45c8e096c5ea31bbfbe12b1693142e2ea61765adbdc652eb06f64d3"

changed /files/skills~1tracelens-analysis-orchestrator~1reference.md/size

BEFORE
33244
AFTER
38758

changed /files/skills~1tracelens-analysis-orchestrator~1templates~1analysis_template.md/sha256

BEFORE
"13865a27f64bdeaf62dcd6a73ad6e511ef5e22267a81c3dfa92d5adc58c7c42e"
AFTER
"0892dd1c82d238e326b5e31b1ebf336883e8c22b36a4c0dc53cf2ff6102dac93"

changed /files/skills~1tracelens-analysis-orchestrator~1templates~1analysis_template.md/size

BEFORE
25675
AFTER
28621

changed /files/skills~1tracelens-analysis-orchestrator~1templates~1sub_agent_spec.md/sha256

BEFORE
"b24a32928bc57b22963dd97416a25d2c0f5892f4665bb659f49c1a03f03a6385"
AFTER
"4105a83d6553edb8bb8bcfb090ef0f4a48cb1c9c733b137bebf9492dd7c1479b"

changed /files/skills~1tracelens-analysis-orchestrator~1templates~1sub_agent_spec.md/size

BEFORE
20803
AFTER
22622

removed /files/staging~1rocm-doctor~1SKILL.md

BEFORE
{
  "sha256": "0c763034dbe3668bce22ba91e087ac6c58002f79d52b2d27fc40657ae19db179",
  "size": 8450
}
AFTER
Field is absent

removed /files/staging~1rocm-doctor~1evals~1evals.json

BEFORE
{
  "sha256": "6e4f28b879db97e5a7cb774869b91c9a218f072bc180a299a7e82cb54260a64c",
  "size": 2563
}
AFTER
Field is absent

removed /files/staging~1rocm-doctor~1reference.md

BEFORE
{
  "sha256": "986705c19648fabfe12415cff207f0a509e3c6b49aaf71057061649bbf7e1e04",
  "size": 5428
}
AFTER
Field is absent

removed /files/staging~1rocm-doctor~1skill-card.md

BEFORE
{
  "sha256": "7dabe7194756436df2c5635e4a1a27a62345d79f8aafd62b09b30066d4a73911",
  "size": 466
}
AFTER
Field is absent

changed /files/walkthroughs~1README.md/sha256

BEFORE
"6630334c7b89b4c40f97240d63f01f24bef608e6ba61f921590e396b942ed122"
AFTER
"06dfcf3279b763a5e9aa919561758d45e54cbbcdb7c292d9a8b51e4ea98dcce7"

changed /files/walkthroughs~1README.md/size

BEFORE
1405
AFTER
1484

changed /files/walkthroughs~1hyperloom-workload-optimizer.md/sha256

BEFORE
"0641fff5d251607931872d5618d9ffd24395e011c4510df405ab96232af9aec6"
AFTER
"3be544c71384f5309e2a35b231104133c29aef9d3db9695b06abba401f4dc34e"

changed /files/walkthroughs~1hyperloom-workload-optimizer.md/size

BEFORE
7062
AFTER
7560

changed /files/walkthroughs~1lemonade-router-builder.md/sha256

BEFORE
"dad4e23789bb693158b761dffdcad47c45abf16fd907516e6dc38015dd2dc250"
AFTER
"70b33f8631435b7b39a7017b95da87cc95a42344b379db55b73f69c171a0f7c2"

changed /files/walkthroughs~1lemonade-router-builder.md/size

BEFORE
5093
AFTER
5170

changed /files/walkthroughs~1local-ai-app-integration.md/sha256

BEFORE
"66b4165389dd2e4276621bb0ebc8a2d57b08aab926e2ad84d8c46e102b7f4c64"
AFTER
"219e6799f060e9c8087687b92982f1ed487258579660815dcc7cae83f89772cd"

changed /files/walkthroughs~1local-ai-app-integration.md/size

BEFORE
6250
AFTER
6390

changed /files/walkthroughs~1local-ai-use.md/sha256

BEFORE
"1ae749a24a9d19e974c0316d4c8d2af3164d058f54136c8643d1ae9688163802"
AFTER
"d40ca9ce900fef391cde42779b10d40b92e3b6e2399b57de5335967109c2ede2"

changed /files/walkthroughs~1local-ai-use.md/size

BEFORE
1736
AFTER
1905

changed /files/walkthroughs~1magpie-kernel-evaluator.md/sha256

BEFORE
"cb28dd388d3bf06c66750bc406ae7b362c70a9474b17a85b892b890ac82908e7"
AFTER
"90a2a809045ef863cccd74565492f07223f329805fc337ae6550fbec0b5ac5c4"

changed /files/walkthroughs~1magpie-kernel-evaluator.md/size

BEFORE
15266
AFTER
15516

changed /files/walkthroughs~1serving-llms-on-epyc.md/sha256

BEFORE
"13d70d3308d60df44de2bbcd09ebc56bc96e0e1ef62cf4bc21144a22c2351516"
AFTER
"6b33fe7777fe2a8aecd4b4b5bf4cee67e8d33d7f272a3d78524b71d746ce0f43"

changed /files/walkthroughs~1serving-llms-on-epyc.md/size

BEFORE
7084
AFTER
7361

changed /files/walkthroughs~1serving-llms-on-instinct.md/sha256

BEFORE
"4b7db79fc3775aadd497c1e1aa17be25e6d6e69a6d7f6047ada0926b6d3a1d1e"
AFTER
"8d06f05248e542a114f6f267f3141cd18ddcc7d9ca46c1043a065a91157fae8d"

changed /files/walkthroughs~1serving-llms-on-instinct.md/size

BEFORE
9861
AFTER
9857

changed /files/walkthroughs~1tracelens-analysis-orchestrator.md/sha256

BEFORE
"4a06eb8b0864aa398abde85fc561e533b789e0f4f9d8434fed848612a133a4b5"
AFTER
"71404ed0aadf49a80d5496a76d9952fbc046540b3bcd6b93b12b1287e404fd5f"

changed /files/walkthroughs~1tracelens-analysis-orchestrator.md/size

BEFORE
9532
AFTER
9789
Full snapshot data
{
  "files": {
    ".agents/plugins/marketplace.json": {
      "sha256": "9f7307d91a5b8cc305ec9c6e06da4af22352f2962a5d2d7f8e729a3e2a4213a1",
      "size": 355
    },
    ".claude-plugin/marketplace.json": {
      "sha256": "ecff6eacb9367066be2b7dcbf31d962943a6d012b408265317d89f404678e064",
      "size": 809
    },
    ".codex-plugin/plugin.json": {
      "sha256": "08213eda069ee496a17c663b941ca997407d543a9a49b92aa983dabca172600b",
      "size": 1476
    },
    ".cursor-plugin/marketplace.json": {
      "sha256": "bf12a600d18e0f2650c3a8aa0f6d75f499e2c9ab3d445f44661582d28e64c03a",
      "size": 1182
    },
    ".gitattributes": {
      "sha256": "32fb19ff90af0d69e2ddcd712a66d2df0c5221c0914e00ff90eb8049d5b1201f",
      "size": 133
    },
    ".github/ISSUE_TEMPLATE/product-repo-approval.yml": {
      "sha256": "220b3b7c26f7cc979b0b784b7134234f403db286824112aea60bfa06570a7730",
      "size": 1783
    },
    ".github/ISSUE_TEMPLATE/skill-bug-or-improvement.yml": {
      "sha256": "0c6891de0b7c72c87cd1d7589d32c7919c8d4797973b8244d04d77bb1dc9eab1",
      "size": 2559
    },
    ".github/ISSUE_TEMPLATE/skill-proposal.yml": {
      "sha256": "2a3212de71a5e1e71baabde8ae1e68b296c1f9d1211a783df16a0393a5723a06",
      "size": 3584
    },
    ".github/federation.json": {
      "sha256": "510e70ad11ccf5a7d3a5004fe4222860dd195e2db4f5ca107c5cfb1bb089bf7c",
      "size": 2723
    },
    ".github/scripts/changed_skills.py": {
      "sha256": "11bb396c49a371dceae72bf1e3a88bd1cf9040c1871b028b0a489680985b9440",
      "size": 5078
    },
    ".github/scripts/check.sh": {
      "sha256": "810ae94f028be37fd2344665ebe1ceaafe112385860f97c08568453fba467c6e",
      "size": 2150
    },
    ".github/scripts/federate_skills.py": {
      "sha256": "2ef60b3b35453bf11ec1d1453fe08bb5739438fabc09d6f5bc5b6f027b86b8da",
      "size": 43413
    },
    ".github/scripts/federation_branches.py": {
      "sha256": "5d8794825673901f2e7c52bb555d04cccec7f1aa6ea647a118f7a45fdae1532c",
      "size": 3925
    },
    ".github/scripts/federation_guard.py": {
      "sha256": "445d12e584512c25c88af7d6d9bc02bcd4b5905f1438aae12b6419b6c9a34894",
      "size": 13262
    },
    ".github/scripts/generate_codex_plugin.py": {
      "sha256": "bdadff31480c5ce8f236b994cf67fb0dca5ac2745db52c43da377d02d8faa7e1",
      "size": 10642
    },
    ".github/scripts/generate_cursor_marketplace.py": {
      "sha256": "84055653a96038199a854555fee34b45b13730be5f95fd8154892f8474362846",
      "size": 8171
    },
    ".github/scripts/publish.sh": {
      "sha256": "5b281049d887d44b4bf2342ed990825f9b8f67478f22a23151f8df683b8b1c94",
      "size": 1654
    },
    ".github/scripts/record_skill_owner.py": {
      "sha256": "e4fcbaa783588fe4c6120b3fa2d146d30a1be19580b0ed088923e8cf217df0f3",
      "size": 5253
    },
    ".github/scripts/skillspector_gate.py": {
      "sha256": "e10b3240594c7c61483741ce15a59179b283f7649fe69b620e91b789251f8e6f",
      "size": 6785
    },
    ".github/scripts/test_cli_install.py": {
      "sha256": "90c76c0dbf0ed4f8148fcc751433c9634047e10fb97308b502f135c7ed6a4c35",
      "size": 18989
    },
    ".github/scripts/test_federate_skills.py": {
      "sha256": "08de2a560c7e6fb940348890d060dc95ffaeec584c9df0c8202e5a76b645c736",
      "size": 24599
    },
    ".github/scripts/test_federation_guard.py": {
      "sha256": "5154a007094db1dd247c3bf77af0037841a638796d0ed5baa98be073fd58a88e",
      "size": 25059
    },
    ".github/scripts/test_record_skill_owner.py": {
      "sha256": "b0d15aa79459e69b9f69c5f9f68ba43904891eaecd770b1cd9265e5794d14059",
      "size": 3091
    },
    ".github/scripts/validate_marketplace.py": {
      "sha256": "1e3461cfc7871193230df887c43bb7ad19cfd425dcf45b9ed50dd22bdbf31933",
      "size": 7945
    },
    ".github/skill_owners.json": {
      "sha256": "65b4be058acbd060b77491b8d8f12607a439550470d75e000c40ec1490e533d7",
      "size": 1080
    },
    ".github/skillspector-allow.yml": {
      "sha256": "f5006c09b59588bb48201ccd2180784ed9b22791248655940fdea00faf838966",
      "size": 9469
    },
    ".github/workflows/cli-install.yml": {
      "sha256": "82ec9f6ea26a7f7ee8641b01936216588ec99808bc6b2c4cdcb420826a4685ec",
      "size": 5182
    },
    ".github/workflows/evals.yml": {
      "sha256": "effc21cabb537736a3b2d7daa48d164015b0f6ef09bb144f5a2ee231fbc9179a",
      "size": 9130
    },
    ".github/workflows/federate-skills.yml": {
      "sha256": "2be1f76b61f161bd71fc020eca76270920f76784a075df49ddba00be9dc1f5ed",
      "size": 7127
    },
    ".github/workflows/federation-guard.yml": {
      "sha256": "7a188c53b486f4b543dacb7b41181432824c63766ac7ef046db5798762b671c8",
      "size": 12073
    },
    ".github/workflows/label-skill-issues.yml": {
      "sha256": "f2fdd61c2d5ab306f634b3534f27861c7d90640505432fa13351f61a86771d25",
      "size": 3199
    },
    ".github/workflows/product-repo-approval.yml": {
      "sha256": "e44ad4950dc1952a16ea276993e6b32ff715e53fe534ae61870b1a12b0adcaf4",
      "size": 17815
    },
    ".github/workflows/skillspector.yml": {
      "sha256": "928b8a21bb6d6bb9831b9130b2f2ae9e431998675fd3adf563207601dea38bfb",
      "size": 8948
    },
    ".github/workflows/validate.yml": {
      "sha256": "9b1c6c5d4c74f3a03452f61be6dc2e2c18265d859a1c1994f4eca5f3ea421797",
      "size": 3876
    },
    ".gitignore": {
      "sha256": "23ba88c5c1057a44a21f861c2e41592c33ef5135f9aa0138f6627e61a0b12c54",
      "size": 321
    },
    "CONTRIBUTING.md": {
      "sha256": "68012be70fc7e3e1a13b596c8d0f2773ac6b2fc419202054ada3464f284858bf",
      "size": 7769
    },
    "LICENSE": {
      "sha256": "6a86faf98a4909cc6341592da475f17fc2f9e18d21b59f30a5a62314c6a8c216",
      "size": 1106
    },
    "README.md": {
      "sha256": "3646d3917859683b560e075d649312b59cd5f9976179476f80ed867d7e38fd8b",
      "size": 16789
    },
    "SECURITY.md": {
      "sha256": "0e3bd89c21792039aecfe6e96995908cb68e22466d6ccbad5a17c41d66d56b7a",
      "size": 487
    },
    "assets/amd.png": {
      "sha256": "671ee8519686294b03b4995bb3ba99045004bbccd328968bf38c30b3cc96c312",
      "size": 16453
    },
    "assets/banner.gif": {
      "sha256": "dafcbe0e9e199d10f6428aca94d858a00ccee9a80071376adfb0799979582920",
      "size": 492481
    },
    "assets/banner.jpg": {
      "sha256": "b83045d77393e04b61473c75caad21c1c2bb45b25c9d8b6ce5dc83c9a2c6c56c",
      "size": 89267
    },
    "docs/best-practices.md": {
      "sha256": "a5cc829d53af61a57bea9b035ca95b9dba18cbbcbd672b4dff5dc43e21c6f02d",
      "size": 7410
    },
    "docs/evals.md": {
      "sha256": "740024dce4ded4eca6ba9a2639d958ced6b4c4dde95b96b8ee5b529d814ddd11",
      "size": 8944
    },
    "docs/rocm-docs/.readthedocs.yaml": {
      "sha256": "0b25e1e87c43018ea2c41b95d83a3bc470575c7fc6a674be3f38ec18f4916af0",
      "size": 194
    },
    "docs/rocm-docs/catalog.md": {
      "sha256": "c78dbcfa660c20c85ead1b7e4feb0a9fbe1f897e26e7dc34b36c9905b9487fbd",
      "size": 220
    },
    "docs/rocm-docs/concepts/index.md": {
      "sha256": "a61b8bebfbd39e2006a6b75c44f0eaa6b995a541bfbe3862de7d9f17f8658443",
      "size": 226
    },
    "docs/rocm-docs/conf.py": {
      "sha256": "6823763f122edb4ee944fedb99d2f5d9a54ae373a69b6224bf7137f05f113e94",
      "size": 1040
    },
    "docs/rocm-docs/index.rst": {
      "sha256": "6328d43d38c21081662a52cac0550874a3566779f94d1829789939090e2f8f99",
      "size": 1199
    },
    "docs/rocm-docs/install/installation.md": {
      "sha256": "32072f841fd33d719b1d2ffa85bdb8d480525bc3c2811ac54f9775eab32dd7cd",
      "size": 415
    },
    "docs/rocm-docs/license.md": {
      "sha256": "4f8dbcaf023b725c25274036522bd443a5870749f69060e615b6919a325d24a3",
      "size": 71
    },
    "docs/rocm-docs/sphinx/_toc.yml.in": {
      "sha256": "fdb38e44d1dbd4c5b9ee67e2a09505372b185e2a8f1c765aab7537e6fc604eb8",
      "size": 853
    },
    "docs/rocm-docs/sphinx/requirements.txt": {
      "sha256": "97021fda96796c38e8947a966f9239846052850ff7332516cc1f51c84ec3352e",
      "size": 22
    },
    "docs/rocm-docs/walkthroughs/hyperloom-workload-optimizer.md": {
      "sha256": "f1a5994737fbbc182ac3e04e9b2efe77b238639934580433104639649b29af19",
      "size": 177
    },
    "docs/rocm-docs/walkthroughs/index.md": {
      "sha256": "514e7be9c23e861f6b6737d92fec435217007488eac421f19c79bca627677d15",
      "size": 1263
    },
    "docs/rocm-docs/walkthroughs/lemonade-router-builder.md": {
      "sha256": "35b9ee5d76ab78cace2ff5605ba57f65cdd9b3c6c6fa8a95e78000fd32ddd3ca",
      "size": 162
    },
    "docs/rocm-docs/walkthroughs/local-ai-app-integration.md": {
      "sha256": "b06bdabe4c883d007fd09a85f908e0085a5cb1bced4540d7ce8d2a3bffb41458",
      "size": 165
    },
    "docs/rocm-docs/walkthroughs/local-ai-use.md": {
      "sha256": "5d3fcc3c5f68654553ca2482ccbdba117687ae1236356549e44f524d032bc073",
      "size": 129
    },
    "docs/rocm-docs/walkthroughs/magpie-kernel-evaluator.md": {
      "sha256": "9cc9cee39efdf1fdc5f7ae520748703e2a93461fabf6b85b1399e8f025b70ffc",
      "size": 162
    },
    "docs/rocm-docs/walkthroughs/serving-llms-on-epyc.md": {
      "sha256": "319406b5c0d79523752796b49fb6a38a936b52b366b2316ba9c58bf5f0d97472",
      "size": 153
    },
    "docs/rocm-docs/walkthroughs/serving-llms-on-instinct.md": {
      "sha256": "37a8e6f675619b55197a1eb222b31afc64d3c42f532f6800176f553c06f6a0c1",
      "size": 165
    },
    "docs/rocm-docs/walkthroughs/tracelens-analysis-orchestrator.md": {
      "sha256": "6e9579a4a41d640856e3fa5925b777a44b8226a4f5779aab7f8932aaf136e124",
      "size": 186
    },
    "docs/skill-requirements.md": {
      "sha256": "c1615fa3f02e26f3308cc89814f37519c4216ed657ee52ed503766263575adc4",
      "size": 5426
    },
    "plugin-metadata.json": {
      "sha256": "524e2cefd2e0492ce6ac30b7ca474598e6f41a8664757055600a239114da9e82",
      "size": 436
    },
    "skills/hyperloom-workload-optimizer/.federated.json": {
      "sha256": "3125107b52b956b23d76bc0bac1c2b7e0c3b3e27e4cea97057808958283cbf47",
      "size": 345
    },
    "skills/hyperloom-workload-optimizer/SKILL.md": {
      "sha256": "baf471f98d4339b735613586ca6c37e7b73ef42e58f35f1b2990f97b407c0f96",
      "size": 6765
    },
    "skills/hyperloom-workload-optimizer/evals/evals.json": {
      "sha256": "a51d534fb04f6128282fe30709ecaeee6c504524e3ae4ae5778cee38459291b6",
      "size": 4360
    },
    "skills/hyperloom-workload-optimizer/evals/machine.yml": {
      "sha256": "3a53df46087df6eef3a243aab68875ab2f67400abf1838b61d5a0420e951f29c",
      "size": 328
    },
    "skills/hyperloom-workload-optimizer/skill-card.md": {
      "sha256": "ecaa026f89d7b902dd52c4b796a59b7c5ac84ad803df3d22dd43f9f9d32c338a",
      "size": 464
    },
    "skills/local-ai-app-integration/.federated.json": {
      "sha256": "a738ed99bea74d67f46c4fca9f5d9235ccc847e90dd859337c011eebb9002ff0",
      "size": 343
    },
    "skills/local-ai-app-integration/SKILL.md": {
      "sha256": "e66d30bcb8969ed98679fa2332b65002d5b94c299b843916d026a1aa6e2718e3",
      "size": 24217
    },
    "skills/local-ai-app-integration/evals/evals.json": {
      "sha256": "6250314828ee9956bf9ac472278df991af00397024d93fbfe2e1ecd11abd0f04",
      "size": 3040
    },
    "skills/local-ai-app-integration/evals/files/apikey-guard/main.py": {
      "sha256": "35fe2402f4e5051a8bedbca4801206bb0a7f44feb97f84ab54faa86130448762",
      "size": 205
    },
    "skills/local-ai-app-integration/evals/files/openai-stub/main.py": {
      "sha256": "bb9f95bfde591f1d62d66f0e3e73baf1a7f5d63a2b45582e07feb6ac94be9c16",
      "size": 45
    },
    "skills/local-ai-app-integration/reference.md": {
      "sha256": "f4e30715ada0c4753e8aed30dc7f7f9d7cfdeab73331736fa6459d1fa732e0b7",
      "size": 13905
    },
    "skills/local-ai-app-integration/skill-card.md": {
      "sha256": "a90a1c2855d6323d0607c87015bea612fede58063ea6e698658a8ef143c9cc1d",
      "size": 159
    },
    "skills/local-ai-use/.federated.json": {
      "sha256": "3a99dc14087ce2d7a0372f94262469bc849c1fd1dda1e194cbf5dc1509db63ee",
      "size": 331
    },
    "skills/local-ai-use/SKILL.md": {
      "sha256": "b93029a8918934626a9ce5ec8286b244022ab92560389ec188d4a612ec6dd3f9",
      "size": 20024
    },
    "skills/local-ai-use/evals/evals.json": {
      "sha256": "1c55c87853eff8b890d0cc48c272f7e01ebe15eb49a6efa347d971d7600cff7e",
      "size": 2189
    },
    "skills/local-ai-use/reference.md": {
      "sha256": "fdbd77baada8f522bd0d540e385d394f476c351307cc7dd3d2daf41dcb7a0a78",
      "size": 9612
    },
    "skills/local-ai-use/scripts/setup_local_ai.py": {
      "sha256": "6f409c54e923e31e705334d395bd72fa16bca8ca67ea1564c087cf1d7bf21c93",
      "size": 27402
    },
    "skills/local-ai-use/skill-card.md": {
      "sha256": "63cf07aed8be151926f9170492b0d5b0e207ca86298ff984b12c299cac564dde",
      "size": 175
    },
    "skills/local-ai-use/templates/local-ai-rule.md": {
      "sha256": "9eb135d4ee7a92a781ebd1d14daadd076faf306ddbdd42e867344048b76a6ee5",
      "size": 5450
    },
    "skills/serving-llms-on-instinct/SKILL.md": {
      "sha256": "2a200238e1b6a3eed4971a47e97ecba5aa26be5dd1244de6905edfc8f60a2b45",
      "size": 15887
    },
    "skills/serving-llms-on-instinct/data/blacklist.json": {
      "sha256": "59feb6605a72250100884dadd4d89473eda4deb3c2827fa6656a39276ef5d347",
      "size": 2050
    },
    "skills/serving-llms-on-instinct/data/gpu_overrides.json": {
      "sha256": "e4a6dbe9146024014df8f63fb15e2bcf7029805bbb3370da4d9a6c4ab47a52c0",
      "size": 5257
    },
    "skills/serving-llms-on-instinct/data/recipes_cache.json": {
      "sha256": "662ac8c69ddfe31c0f721bde40a82ac21c99d6ebdb56f54931374ee20f0c56a5",
      "size": 696133
    },
    "skills/serving-llms-on-instinct/evals/evals.json": {
      "sha256": "4659e4ec1ed160fe67f08e774495728c5223a5f01ad86c45ea1add7a6c9cd0bb",
      "size": 2488
    },
    "skills/serving-llms-on-instinct/evals/hooks.py": {
      "sha256": "df96526ce8726ecd542709c68fcff264c015b1dcb375708a990c5289a60f2c68",
      "size": 3239
    },
    "skills/serving-llms-on-instinct/evals/machine.yml": {
      "sha256": "3a53df46087df6eef3a243aab68875ab2f67400abf1838b61d5a0420e951f29c",
      "size": 328
    },
    "skills/serving-llms-on-instinct/reference.md": {
      "sha256": "a24d53ef9a74b19f5a299e1f9c62d48e3f12c5f3c2843fc090ced6f632f20fb6",
      "size": 4621
    },
    "skills/serving-llms-on-instinct/scripts/detect.py": {
      "sha256": "5d040fe26dca7011470dd75468b35cb6363369dda682a4ebb12b1391d947e5f0",
      "size": 4636
    },
    "skills/serving-llms-on-instinct/scripts/estimate_vram.py": {
      "sha256": "c815d07ab91bef3035fe3a4c0f07e006599de0c65c731c1cf124f95a29f1d804",
      "size": 8845
    },
    "skills/serving-llms-on-instinct/scripts/sync_recipes.py": {
      "sha256": "386a2e92e7414535d02b3ada809778a278ac4ae8b504208eb3302e56bdfd4e56",
      "size": 6337
    },
    "skills/serving-llms-on-instinct/scripts/validate.py": {
      "sha256": "7de7b69e9229e64c0353345a31a7627440445759153c6e57e9df52a5f43c5903",
      "size": 8453
    },
    "skills/serving-llms-on-instinct/skill-card.md": {
      "sha256": "c34300b4e912366013a898ba050353d553b5a69d5ffa8bdfbdaab22de94fdd98",
      "size": 244
    },
    "skills/tracelens-analysis-orchestrator/.federated.json": {
      "sha256": "3c0e9aa5bc0bcf548d35b7c989a1e219d81325597b8a89a751bc076b4f464bb1",
      "size": 354
    },
    "skills/tracelens-analysis-orchestrator/SKILL.md": {
      "sha256": "b9318e97ccc875ce24dc6cff0bfe7cd1040de4f67299fef68bea707f226de279",
      "size": 3204
    },
    "skills/tracelens-analysis-orchestrator/agents/convolution-analyzer.md": {
      "sha256": "8cc3bf6f914dc7abe9095f861fe2ab8eed1fc87da270bff1863231ee746f5f7d",
      "size": 7916
    },
    "skills/tracelens-analysis-orchestrator/agents/cpu-idle-analyzer.md": {
      "sha256": "b7653afd551663c34f6012859ad35b59f56aa06424a77312d9ff4ef1a8b5873e",
      "size": 6408
    },
    "skills/tracelens-analysis-orchestrator/agents/elementwise-analyzer.md": {
      "sha256": "3c6967c9ef0b39adbd782e69bd331efeaf87bccfc1727834297a83a9ee8c2b7a",
      "size": 7250
    },
    "skills/tracelens-analysis-orchestrator/agents/gemm-analyzer.md": {
      "sha256": "31fdbbfe33d06a6753cd5736b7e5644c79a8c0572ee04734ed68c55aa4208b4e",
      "size": 6412
    },
    "skills/tracelens-analysis-orchestrator/agents/generic-op-analyzer.md": {
      "sha256": "f60442c6bc93172f9d8860840b352d1c6f2b5fd58cbf171f42d0c4c55e4c3673",
      "size": 9730
    },
    "skills/tracelens-analysis-orchestrator/agents/kernel-coherence-agent.md": {
      "sha256": "badd2f7a2843eadd972c6660a08d8ecf17b21f5dfb5b20a01309650ec0be0556",
      "size": 8396
    },
    "skills/tracelens-analysis-orchestrator/agents/kernel-fusion-analyzer.md": {
      "sha256": "434d4c8fc215de099e5f3a4583a87d95d1a5de5c508ec915be282406ec42beab",
      "size": 15156
    },
    "skills/tracelens-analysis-orchestrator/agents/kernel-stem-preprocessing-agent.md": {
      "sha256": "6345bdc9428c516e1257581831c1880cc849b94a887c88a02a1a9e9a03bf7024",
      "size": 5839
    },
    "skills/tracelens-analysis-orchestrator/agents/kernel-unification-agent.md": {
      "sha256": "05b4375c4bce688781f36ac52229369185db1315e71a10d7552eedaddb0f04b9",
      "size": 6567
    },
    "skills/tracelens-analysis-orchestrator/agents/model-identification-agent.md": {
      "sha256": "48847d351deb5eabf07abfd1a7dbd78d7988e9a247171e56a77ae748fbf975f7",
      "size": 4290
    },
    "skills/tracelens-analysis-orchestrator/agents/moe-analyzer.md": {
      "sha256": "c0429f06af501d69f523edde1e4005d1af6c1181c88e2cb50c98b32bb3760523",
      "size": 8665
    },
    "skills/tracelens-analysis-orchestrator/agents/multi-kernel-analyzer.md": {
      "sha256": "d754262913ac34cc64ff1b721b5cb472bfc70bbbb1111f90810db0401181c270",
      "size": 11732
    },
    "skills/tracelens-analysis-orchestrator/agents/norm-analyzer.md": {
      "sha256": "b79d2f5330954bed595797e4ab17698811298906c9787c785a97bc64b47b1e10",
      "size": 6876
    },
    "skills/tracelens-analysis-orchestrator/agents/reduce-analyzer.md": {
      "sha256": "acfe74c2774e7191e24cf1e53d9f0d999d2cda29f89b8cdfc4156508abe32fec",
      "size": 6456
    },
    "skills/tracelens-analysis-orchestrator/agents/roofline-augment-agent.md": {
      "sha256": "55950391e4b01f8b067cfa1fe02b4791b28298017a1b0caf4b43f4c7f28c8cbe",
      "size": 6281
    },
    "skills/tracelens-analysis-orchestrator/agents/sdpa-analyzer.md": {
      "sha256": "1ab762c92430374133b0668c4d57f00ac3d80e54ee9dabaf15eece0f2d2c3056",
      "size": 10880
    },
    "skills/tracelens-analysis-orchestrator/agents/semantic-comparison-agent.md": {
      "sha256": "21257271821dd3120654eef77a6d3f4ffbe17a34a28032465999947b1b4595ac",
      "size": 12670
    },
    "skills/tracelens-analysis-orchestrator/agents/triton-analyzer.md": {
      "sha256": "1092c143c9b09e345a40babee3a07630262e9a097f82dca1ae699b7d2ba49693",
      "size": 7016
    },
    "skills/tracelens-analysis-orchestrator/evals/.gitignore": {
      "sha256": "b0cfa8719305501babda5086ca4152e60c3b9f860eb9d4410697ae0190d3fdc1",
      "size": 266
    },
    "skills/tracelens-analysis-orchestrator/evals/EVAL_RUBRICS.md": {
      "sha256": "4a59f845107074f04424685cdbd25d739aa542786e2869db5123a4cca3b2364a",
      "size": 17847
    },
    "skills/tracelens-analysis-orchestrator/evals/README.md": {
      "sha256": "86aafa4acbf14c2d9c49b94240f18f283116e356a7737ed7140c387be44ad0c6",
      "size": 19259
    },
    "skills/tracelens-analysis-orchestrator/evals/analysis_tests/combined_traces_comparative.csv": {
      "sha256": "5174580a890f63aa283e4e2f91a09916967acfe6438c2b87c8d7b8b8752ea9cb",
      "size": 5191
    },
    "skills/tracelens-analysis-orchestrator/evals/analysis_tests/combined_traces_standalone.csv": {
      "sha256": "1cd59fd5d63d6ef8f0bf7eb2d3423613831f63cca6210b763565832d04362168",
      "size": 10541
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_scripts/generate_ref.sh": {
      "sha256": "49928a54ceb0b9313672aeb283ca6e30f0d480c3288899a3a898134278351828",
      "size": 14339
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_scripts/kill_eval_jobs.sh": {
      "sha256": "917707fe6789c0bab104315fbb2e63d1aa86295404f8067c9b1d1149f2b1ca3d",
      "size": 4127
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_scripts/pack_test_archives.sh": {
      "sha256": "176bfd4fee136941a2cfa269a96e7919e95ff2f3ab75dfbfd62cd7f7cd3a32e7",
      "size": 4732
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_scripts/run_pi_analysis_in_docker.sh": {
      "sha256": "58b8b6c37c6b4c164930babb739e4e41ec0d4f7cf0d220253f2b089703a2ba90",
      "size": 20031
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_scripts/run_repeatability_parallel.sh": {
      "sha256": "025077e3012383dd49d411d13fa0de3c8431f8964ae7b55b6716a07b29a94927",
      "size": 24915
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_utils/aggregate_repeatability.py": {
      "sha256": "e91d8256564f846c74e7c890a9056507b3bbe3d5e45d6c0ac2d98072000c9411",
      "size": 24663
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_utils/compare_lca_partitions.py": {
      "sha256": "fdae0d19985f7f94e5b13dc767147d2353a1738ae08568e2f6e1f3bb72b2c728",
      "size": 16624
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_utils/manual_eval_checklist.md": {
      "sha256": "4caddfad1cb49330a6802b21f952a22194ad5a9fc9fba5df2b292b3e9d1adc8b",
      "size": 3436
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_utils/merge_results.py": {
      "sha256": "cffbe981a673a15363d52e7600966d55e9fcca5cc5e47d30678bb4ac6d22e2d9",
      "size": 3023
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_utils/quality_scripted_evals.py": {
      "sha256": "e9468c6d765b9e624b111261e8e5a6bd5fbc7c657fb7e822b61eaeac550c33f4",
      "size": 8773
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_utils/report_section_rules.yaml": {
      "sha256": "762e4871f915039db287187baddf86a439b13d3a8265176cc59575a7724b6274",
      "size": 3890
    },
    "skills/tracelens-analysis-orchestrator/evals/eval_utils/workflow_scripted_evals.py": {
      "sha256": "8476ac44b63a2e82f97cd94a0e4fa7212c78546fde133324f025f50c625960aa",
      "size": 54560
    },
    "skills/tracelens-analysis-orchestrator/evals/evals.json": {
      "sha256": "2e4823156d3ac31b0ef8b02060af6d63e63f1e96cb864bd2fee295b6254bbf80",
      "size": 3133
    },
    "skills/tracelens-analysis-orchestrator/evals/machine.yml": {
      "sha256": "84c1fba8ef08613c98f8bfa6c4ce182ef5bb6019c0a21ab8272648043e1c4fa6",
      "size": 285
    },
    "skills/tracelens-analysis-orchestrator/evals/partial_tests/README.md": {
      "sha256": "b735f9b94ec8542f0ddc807bf187e0f595dd47a28c0ad1043ea5521068d233e4",
      "size": 5567
    },
    "skills/tracelens-analysis-orchestrator/evals/partial_tests/eval_utils/semantic_partition_scripted_evals.py": {
      "sha256": "15f71e37729f93eb9bd6d11f4f18d7c57ec5de96f47e665fd24ad66e440a134f",
      "size": 5924
    },
    "skills/tracelens-analysis-orchestrator/evals/partial_tests/eval_utils/semantic_purity_aggregate.py": {
      "sha256": "c63439afe74897b25e0644107857ce477ee1e656ad401d0faa1ed24a1b57b326",
      "size": 9319
    },
    "skills/tracelens-analysis-orchestrator/evals/partial_tests/generate_gold_ref.sh": {
      "sha256": "49ffac8367e56ccf8c38665c80d14ad7a59fb2da35f9ee7e1568c238f41535b5",
      "size": 4232
    },
    "skills/tracelens-analysis-orchestrator/evals/partial_tests/partial_test_cases.csv": {
      "sha256": "15e3865508af1f9758289d7b05924218dd8db9729f32dc862915243f231aac24",
      "size": 1044
    },
    "skills/tracelens-analysis-orchestrator/evals/partial_tests/run_partial_tests.sh": {
      "sha256": "2f25a3575f6bd1c816589ceacc23ac9936e37d750cb0ae8f72daf09481d58fd5",
      "size": 7962
    },
    "skills/tracelens-analysis-orchestrator/evals/skills/eval-post-processing/SKILL.md": {
      "sha256": "c7881b49cbcff71ca2b76683e01dfc7db669011b4309fb30987d8dc15187f880",
      "size": 1693
    },
    "skills/tracelens-analysis-orchestrator/evals/skills/eval-post-processing/reference.md": {
      "sha256": "4c81c6a300eb76a6c4d6b25aa1af55cc67f5064dbe9913e530735c1a0a151bf4",
      "size": 14842
    },
    "skills/tracelens-analysis-orchestrator/evals/skills/eval-post-processing/run_post_processing.py": {
      "sha256": "de7f72c9042776648a11d91ec0aba61e25f80315b2098125d83c44604be55014",
      "size": 35336
    },
    "skills/tracelens-analysis-orchestrator/evals/skills/quality-llm-eval/SKILL.md": {
      "sha256": "c659991834b66caddec1d7f84f4d89b63d40acf28e1ecdc346a524099b682e43",
      "size": 1007
    },
    "skills/tracelens-analysis-orchestrator/evals/skills/quality-llm-eval/reference.md": {
      "sha256": "6a96ff87a4c722c9ad6f26a67295ba4f8133b63fb9cd6d9fcc69e568ebfd9e38",
      "size": 6498
    },
    "skills/tracelens-analysis-orchestrator/evals/skills/workflow-llm-eval/SKILL.md": {
      "sha256": "4290e389d287146fd9a5647b3bf7f1bc0ca5d2bc2a4cbd4936905bf2ad5e0e27",
      "size": 960
    },
    "skills/tracelens-analysis-orchestrator/evals/skills/workflow-llm-eval/reference.md": {
      "sha256": "7d985ec98f2e1cef4ab7e2953ed66499808fbf8402b73761b0f8c09147249200",
      "size": 2548
    },
    "skills/tracelens-analysis-orchestrator/reference.md": {
      "sha256": "1aa42df8d45c8e096c5ea31bbfbe12b1693142e2ea61765adbdc652eb06f64d3",
      "size": 38758
    },
    "skills/tracelens-analysis-orchestrator/skill-card.md": {
      "sha256": "4fffef8a6e61d49990b3183f541cd43060153a0446ac9bdbb876a8234aece7f2",
      "size": 396
    },
    "skills/tracelens-analysis-orchestrator/templates/analysis_template.md": {
      "sha256": "0892dd1c82d238e326b5e31b1ebf336883e8c22b36a4c0dc53cf2ff6102dac93",
      "size": 28621
    },
    "skills/tracelens-analysis-orchestrator/templates/sub_agent_spec.md": {
      "sha256": "4105a83d6553edb8bb8bcfb090ef0f4a48cb1c9c733b137bebf9492dd7c1479b",
      "size": 22622
    },
    "staging/apu-memory-tuner/SKILL.md": {
      "sha256": "7622962583e1a9be411a241b6415b3ce67374eeee569b17c53a90f715b53db5b",
      "size": 10263
    },
    "staging/apu-memory-tuner/reference.md": {
      "sha256": "a4144d10fb43f6ed06ac33e1e59d61cdd4f7a952283af1bfe622285bb9fc36ae",
      "size": 10563
    },
    "staging/apu-memory-tuner/scripts/apply_profile.py": {
      "sha256": "4b7161f61cc08fa75e3b2d28a592903af4bf56387ce03990f4edc44c50f723e8",
      "size": 15283
    },
    "staging/apu-memory-tuner/scripts/detect_platform.py": {
      "sha256": "059a4cf5896900dd4b6eda5d02ff9e36eea78082b781efa57157bf266e2e80ea",
      "size": 17311
    },
    "staging/apu-memory-tuner/scripts/show_config.py": {
      "sha256": "167916dbdf3b69253cb83ba8139084f1041a05e6086425d1302bf9d96c84a4de",
      "size": 10951
    },
    "staging/apu-memory-tuner/skill-card.md": {
      "sha256": "328462a9003b307eea9fdb17c568a41bcba9aaa95529422dd49f965d95564668",
      "size": 208
    },
    "walkthroughs/README.md": {
      "sha256": "06dfcf3279b763a5e9aa919561758d45e54cbbcdb7c292d9a8b51e4ea98dcce7",
      "size": 1484
    },
    "walkthroughs/hyperloom-workload-optimizer.md": {
      "sha256": "3be544c71384f5309e2a35b231104133c29aef9d3db9695b06abba401f4dc34e",
      "size": 7560
    },
    "walkthroughs/lemonade-router-builder.md": {
      "sha256": "70b33f8631435b7b39a7017b95da87cc95a42344b379db55b73f69c171a0f7c2",
      "size": 5170
    },
    "walkthroughs/local-ai-app-integration.md": {
      "sha256": "219e6799f060e9c8087687b92982f1ed487258579660815dcc7cae83f89772cd",
      "size": 6390
    },
    "walkthroughs/local-ai-use.md": {
      "sha256": "d40ca9ce900fef391cde42779b10d40b92e3b6e2399b57de5335967109c2ede2",
      "size": 1905
    },
    "walkthroughs/magpie-kernel-evaluator.md": {
      "sha256": "90a2a809045ef863cccd74565492f07223f329805fc337ae6550fbec0b5ac5c4",
      "size": 15516
    },
    "walkthroughs/serving-llms-on-epyc.md": {
      "sha256": "6b33fe7777fe2a8aecd4b4b5bf4cee67e8d33d7f272a3d78524b71d746ce0f43",
      "size": 7361
    },
    "walkthroughs/serving-llms-on-instinct.md": {
      "sha256": "8d06f05248e542a114f6f267f3141cd18ddcc7d9ca46c1043a065a91157fae8d",
      "size": 9857
    },
    "walkthroughs/tracelens-analysis-orchestrator.md": {
      "sha256": "71404ed0aadf49a80d5496a76d9952fbc046540b3bcd6b93b12b1287e404fd5f",
      "size": 9789
    }
  }
}

SHA-256 of public snapshot: 77ed69ff744e2b3a2da6d6152f88a32d7abc66749d2e74b828f34f41546a1da5