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
- 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
- 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
- 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
- Validate PinnedSource records at config load time (all-or-nothing digest/URL fields) so startup fails fast with a clear message
- Add a unit test asserting every shipped pin has paired digests
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
- The prepared {spec.name} runtime failed integrity validation
- {spec.name} source revision must be a lowercase full Git com
- Add a Provider connection block before running this recipe.
- Unsupported attention_backend '{value}'. Use one of: {', '.j
- Unsupported transformer_cache '{value}'. Use one of: off, au
AI-assisted analysis of unslothai/unsloth@203007d190 (2026-08-15).
Data as JSON: /api/errors/3d840055d65fba80.
Report an issue: GitHub.