unslothai/unsloth · error · RuntimeError

The pinned {spec.name} source archive is not configured

Error message

The pinned {spec.name} source archive is not configured

What it means

Guard at the top of _install_archive_source: the code path requires both spec.archive_url and spec.source_tree_digest, and refuses to run if either is None. Sealed (digest-pinned) archive installation is all-or-nothing by design — an archive without a verified tree digest would be an untrusted input.

Source

Thrown at studio/backend/utils/third_party_source.py:632

class _BoundedArchiveReader:
    def __init__(self, handle, limit: int):
        self._handle = handle
        self._limit = limit
        self._read = 0

    def read(self, size: int = -1) -> bytes:
        remaining = self._limit - self._read
        requested = remaining + 1 if size < 0 else min(size, remaining + 1)
        data = self._handle.read(requested)
        self._read += len(data)
        if self._read > self._limit:
            raise RuntimeError("The pinned source archive expands too large")
        return data


def _install_archive_source(destination: Path, spec: PinnedSource) -> None:
    if spec.archive_url is None or spec.source_tree_digest is None:
        raise RuntimeError(f"The pinned {spec.name} source archive is not configured")
    workspace = Path(tempfile.mkdtemp(prefix = ".archive-", dir = destination.parent))
    archive = workspace / "source.tar.gz"
    staging = workspace / "source"
    staging.mkdir()
    try:
        _download_archive(spec.archive_url, archive, spec)
        member_count = 0
        uncompressed_bytes = 0
        extracted = set()
        try:
            with archive.open("rb") as compressed:
                with gzip.GzipFile(fileobj = compressed, mode = "rb") as decompressed:
                    reader = _BoundedArchiveReader(decompressed, _ARCHIVE_MAX_TAR_BYTES)
                    with tarfile.open(fileobj = reader, mode = "r|") as bundle:
                        for member in bundle:
                            member_count += 1
                            if member_count > _ARCHIVE_MAX_MEMBERS:
                                raise RuntimeError(

View on GitHub (pinned to 203007d190)

Solutions

  1. Compute the digest for the pinned tree and set source_tree_digest (and runtime_tree_digest) — note ensure_pinned_source also enforces both digests configured together
  2. If you cannot produce a digest, use the non-sealed configuration consistently: leave archive_url unset so the git-clone path is used with _checkout_manifest
  3. Audit the PinnedSource construction site for partially-filled entries

Example fix

# before
PinnedSource(
    name="foo", package="foo", revision=SHA,
    archive_url="https://codeload.github.com/org/foo/tar.gz/" + SHA,
    source_tree_digest=None,  # incomplete pin
)

# after
PinnedSource(
    name="foo", package="foo", revision=SHA,
    archive_url="https://codeload.github.com/org/foo/tar.gz/" + SHA,
    source_tree_digest=compute_tree_digest(checkout),
    runtime_tree_digest=compute_runtime_digest(...),
)
Defensive patterns

Strategy: validation

Validate before calling

assert spec.archive_url is not None and spec.source_tree_digest is not None, (
    "archive installation requires both archive_url and source_tree_digest"
)

Type guard

from dataclasses import is_dataclass

def pin_ready_for_archive_install(spec) -> bool:
    return spec.archive_url is not None and spec.source_tree_digest is not None and spec.runtime_tree_digest is not None

Prevention

When it happens

Trigger: Constructing a PinnedSource with archive_url set but source_tree_digest None (or vice versa), or with both None while the environment/config routes installation through the archive path instead of the git-clone path.

Common situations: Hand-writing a PinnedSource entry and forgetting the digest; migrating config where a new archive_url field was added but digests were never populated; an internal-only package pinned without a published digest.

Related errors


AI-assisted analysis of unslothai/unsloth@203007d190 (2026-08-15). Data as JSON: /api/errors/3d840055d65fba80. Report an issue: GitHub.