anthropics/skills · error · ValueError

relationship target resolves to nothing: {target!r}

Error message

relationship target resolves to nothing: {target!r}

What it means

pptx copy of the empty-resolution guard (same as error 5): opc_target() raises when a non-empty relationship target normalizes to no part name at all (all segments '.', empty, or cancelled by '..' — e.g. Target='.' or 'slides/..'). Such an entry is corrupt; the library refuses to guess.

Source

Thrown at skills/pptx/scripts/office/helpers/__init__.py:54

    if target.startswith("/"):
        joined = target.lstrip("/")
    else:
        joined = posixpath.join(posixpath.dirname(source_part), target)

    parts: list[str] = []
    for segment in posixpath.normpath(joined).split("/"):
        if segment in ("", "."):
            continue
        if segment == "..":
            if not parts:
                raise ValueError(f"relationship target escapes the package: {target!r}")
            parts.pop()
        else:
            parts.append(segment)

    if not parts:
        raise ValueError(f"relationship target resolves to nothing: {target!r}")
    return "/".join(parts)


def rels_source_part(rels_file: Path, unpacked_dir: Path) -> str:
    owner_dir = rels_file.parent.parent.relative_to(unpacked_dir)
    return posixpath.join(owner_dir.as_posix(), rels_file.name[: -len(".rels")]).lstrip("./")


def part_text(data: bytes) -> str:
    return data.decode("utf-8", "surrogateescape")


XML_SPACE = " \t\r\n"


def rendered_text(text: str, preserve: bool) -> str:
    return text if preserve else text.strip(XML_SPACE)

View on GitHub (pinned to f6656c1256)

Solutions

  1. Delete the dead <Relationship> element or point it at the intended real part.
  2. Re-save the deck with PowerPoint/LibreOffice to rebuild .rels files.
  3. Validate the package (OOXML validator) before running cleaning/thumbnail pipelines.
  4. If generating decks yourself with python-pptx or similar, upgrade — early versions had rels-writing bugs.

Example fix

<!-- before -->
<Relationship Id="rId3" Type=".../notesSlide" Target="."/>

<!-- after: remove the element, or -->
<Relationship Id="rId3" Type=".../notesSlide" Target="../notesSlides/notesSlide1.xml"/>
Defensive patterns

Strategy: validation

Validate before calling

import posixpath

def target_resolves_to_part(target: str, source_part: str) -> bool:
    if not target:
        return False
    joined = posixpath.normpath(posixpath.join(posixpath.dirname(source_part), target)) if not target.startswith("/") else posixpath.normpath(target.lstrip("/"))
    return joined not in ("", ".")

Try / catch

try:
    opc_target(target, source_part, target_mode)
except ValueError as e:
    if "resolves to nothing" in str(e):
        drop_relationship()  # dead entry
    else:
        raise

Prevention

When it happens

Trigger: A Relationship in a pptx .rels file with Target="." or a self-cancelling path; encountered while thumbnail.py or clean.py walks relationships.

Common situations: Placeholder targets written by buggy serializers; relationships meant to be removed but left with a dummy target; hand-edited rels files.

Related errors


AI-assisted analysis of anthropics/skills@f6656c1256 (2026-08-14). Data as JSON: /api/errors/22f9ed538896fbf3. Report an issue: GitHub.