{
  "schemaVersion": 1,
  "skillId": "anthropic-pptx",
  "reviewedOn": "2026-10-19",
  "revision": "dbd4588f9e1033efb41dad4bef2f7947c8993d44",
  "status": "completed-bounded-source-review",
  "mode": "manual-source-review",
  "scope": "Manual review of purpose, dependencies, mutation boundaries, path helpers and selected cleanup control flow. Runtime not run.",
  "runtime": {
    "status": "not-run",
    "reason": "License boundary: pinned terms restrict copying outside Anthropic Services; this pass does not establish permission for this execution context. No proprietary helper imported or executed",
    "actualHelperCalls": 0,
    "workflowExecutions": 0
  },
  "countMeaning": "Counts are manual source-review expectations, not executed tests or a runtime score.",
  "environment": {
    "method": "Manual source reading; no upstream code imported or executed"
  },
  "commands": [
    "Read pinned entrypoint, per-skill license and named helper control flow; record findings without executing the upstream skill."
  ],
  "controls": [
    "Public source only; no proprietary helper execution; no published upstream source"
  ],
  "isolationLimits": [
    "No runtime isolation was tested because runtime was not run"
  ],
  "findings": [
    {
      "severity": "attention",
      "title": "Runtime not run: restrictive per-skill terms",
      "detail": "The pinned PPTX license labels all skill components subject to Anthropic-service agreements and adds restrictions on copying outside those services, derivatives and redistribution. This pass stopped at source review; no PPTX helper was imported or executed here."
    },
    {
      "severity": "attention",
      "title": "Cleanup can mistake an XML naming change for an empty deck",
      "detail": "Source trace: slide discovery looks for literal p:sldId elements and double-quoted r:id attributes. If a valid presentation uses another XML prefix or quoting form, both discovery and its refusal guard can miss the slide list. The cleanup path can then treat on-disk slides as orphaned. This is a source-level concern, not a reproduced deletion; use a disposable copy and inspect the slide list before cleanup."
    },
    {
      "severity": "attention",
      "title": "Windows path formatting can leave deleted-part declarations",
      "detail": "Source trace: removed file paths are recorded with str(Path), while content-type PartName values use forward slashes. On Windows the comparison can miss a deleted part. No Windows cleanup was executed; check the resulting package with an independent validator in an authorized runtime."
    },
    {
      "severity": "attention",
      "title": "Editing helpers can overwrite or delete content",
      "detail": "The entrypoint documents in-place editing, add_slide.py defaults to replacing its input package unless an output path is supplied, and clean.py deletes unreferenced parts. The review did not establish rollback or recovery. Work from a retained original and a separate output."
    }
  ],
  "limitations": [
    "Runtime not run because the reviewed per-skill terms restrict the evaluation context. These findings come from source inspection only.",
    "No PowerPoint/LibreOffice rendering, template interoperability, generated-deck quality, font behavior or malicious-document resilience was evaluated.",
    "One bounded pass at one pinned revision; no model-effectiveness baseline, repeated trials, security certification or assurance about future versions.",
    "No private files, credentials, authenticated accounts, paid requests or real customer workflows. Transitive dependencies and current vulnerability advisories were not audited."
  ],
  "cases": [
    {
      "id": "pptx-license-boundary",
      "mode": "manual-source-review",
      "expectation": "Resolve the per-skill license before choosing an execution method",
      "passed": true,
      "observed": {
        "basis": "Manual reading and control-flow trace; no helper executed",
        "detail": "The skill frontmatter says Proprietary; the separate license ties use to Anthropic-service agreements and restricts outside copies and redistribution. Runtime was not attempted."
      },
      "sourceEvidence": {
        "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/LICENSE.txt",
        "symbol": "LICENSE and ADDITIONAL RESTRICTIONS"
      }
    },
    {
      "id": "pptx-dependencies",
      "mode": "manual-source-review",
      "expectation": "Identify distinct authoring, inspection and rendering dependencies",
      "passed": true,
      "observed": {
        "basis": "Manual reading and control-flow trace; no helper executed",
        "detail": "The entrypoint uses Node/pptxgenjs for generation, Python/XML helpers for edits, markitdown for extraction and LibreOffice plus PDF image tooling for rendered QA. Preinstalled assumptions are specific to the upstream environment."
      },
      "sourceEvidence": {
        "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/SKILL.md",
        "symbol": "Scripts; Dependencies; Converting to Images"
      }
    },
    {
      "id": "pptx-mutation-contract",
      "mode": "manual-source-review",
      "expectation": "Locate the input-replacement and deletion boundaries",
      "passed": true,
      "observed": {
        "basis": "Manual reading and control-flow trace; no helper executed",
        "detail": "add_slide_to_package selects output or the original package; clean.py unlinks parts it classifies as orphaned. The entrypoint tells users to supply -o for a separate package and run cleanup only after the slide list is final."
      },
      "sourceEvidence": {
        "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/scripts/add_slide.py",
        "symbol": "add_slide_to_package; main"
      }
    },
    {
      "id": "pptx-package-target-guard",
      "mode": "manual-source-review",
      "expectation": "Inspect package-path checks without treating them as proven containment",
      "passed": true,
      "observed": {
        "basis": "Manual reading and control-flow trace; no helper executed",
        "detail": "The shared helper rejects external/URI relationships from internal resolution, parent traversal beyond the package, archive symlinks and extraction paths outside the destination. These checks were read, not fuzzed or executed."
      },
      "sourceEvidence": {
        "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/scripts/office/helpers/__init__.py",
        "symbol": "opc_target; safe_extract"
      }
    },
    {
      "id": "pptx-namespace-cleanup",
      "mode": "manual-source-review",
      "expectation": "Discover slide-list entries independently of XML prefix and quote style",
      "passed": false,
      "observed": {
        "basis": "Manual reading and control-flow trace; no helper executed",
        "detail": "The literal p:sldId and double-quoted r:id regular expressions are used for discovery and the refusal guard. A differently prefixed or single-quoted list can produce no matches, allowing the orphan-removal loop to select every on-disk slide. This is a manual branch trace only."
      },
      "sourceEvidence": {
        "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/scripts/clean.py",
        "symbol": "get_slides_in_sldidlst; remove_orphaned_slides"
      }
    },
    {
      "id": "pptx-content-type-paths",
      "mode": "manual-source-review",
      "expectation": "Compare deleted parts with OOXML PartName values using platform-independent separators",
      "passed": false,
      "observed": {
        "basis": "Manual reading and control-flow trace; no helper executed",
        "detail": "The removed list contains str(rel_path), whereas update_content_types compares forward-slash PartName text directly. Windows path string conventions can prevent a match. No upstream helper executed."
      },
      "sourceEvidence": {
        "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/scripts/clean.py",
        "symbol": "remove_orphaned_slides; remove_orphaned_files; update_content_types"
      }
    }
  ],
  "results": {
    "passed": 4,
    "failed": 2,
    "total": 6
  },
  "sourceManifest": [
    {
      "path": "skills/pptx/SKILL.md",
      "sha256": "a7ff03e2c85b636f55232a6b1555f5dd90216b7a1a359ab289d8364e6acbc6a0",
      "gitBlob": "41cd2306977f269bb1d8169a9643b35053aa66bd",
      "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/SKILL.md"
    },
    {
      "path": "skills/pptx/LICENSE.txt",
      "sha256": "79f6d8f5b427252fa3b1c11ecdbdb6bf610b944f7530b4de78f770f38741cfaa",
      "gitBlob": "c55ab42224874608473643de0a85736b7fec0730",
      "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/LICENSE.txt"
    },
    {
      "path": "skills/pptx/scripts/add_slide.py",
      "sha256": "3922f819ee1f6b8bdc6aa146d1a86de70640f5f919321fe3f01a764482ff69c9",
      "gitBlob": "f013ea94d1785c8cf767fb69284ffb5b8dd9d390",
      "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/scripts/add_slide.py"
    },
    {
      "path": "skills/pptx/scripts/clean.py",
      "sha256": "5c808cd4dff7e02661ef3c68b5917f4e25097cc6610c92a3a7df4a6366a5c3c1",
      "gitBlob": "551dd23192f6eae8e79d4b59b08a3cd9d10feadd",
      "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/scripts/clean.py"
    },
    {
      "path": "skills/pptx/scripts/office/helpers/__init__.py",
      "sha256": "678e42456d9e10923c8b9a93691cdd993de3433448a184fa72a0c31f4ae086d5",
      "gitBlob": "d3c5817c7e50b23bdd82032c8f89fed497bce9fa",
      "sourceUrl": "https://github.com/anthropics/skills/blob/dbd4588f9e1033efb41dad4bef2f7947c8993d44/skills/pptx/scripts/office/helpers/__init__.py"
    }
  ],
  "baseline": {
    "status": "not-run",
    "reason": "No model-effectiveness comparison or workflow-quality claim"
  },
  "repetitions": 0
}
