conductor-oss/conductor · error · IllegalArgumentException

Failed to read skill package: {e.getMessage()}

Error message

Failed to read skill package: {e.getMessage()}

What it means

Thrown by register() (via readPackage) when packageFile.getBytes() throws an IOException. This is an I/O failure reading the uploaded multipart file's bytes from its temporary storage, not a content error. The original IOException is attached as the cause.

Source

Thrown at agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/service/SkillRegistryService.java:420

            throw new IllegalArgumentException("Skill manifest is required");
        }
        try {
            return MAPPER.readValue(manifestJson, MAP_TYPE);
        } catch (IOException e) {
            throw new IllegalArgumentException("Invalid skill manifest JSON: " + e.getMessage(), e);
        }
    }

    private byte[] readPackage(MultipartFile packageFile) {
        try {
            byte[] bytes = packageFile.getBytes();
            if (bytes.length > maxPackageBytes) {
                throw new IllegalArgumentException(
                        "Skill package exceeds max size of " + maxPackageBytes + " bytes");
            }
            return bytes;
        } catch (IOException e) {
            throw new IllegalArgumentException(
                    "Failed to read skill package: " + e.getMessage(), e);
        }
    }

    @SuppressWarnings("unchecked")
    private ParsedSkillPackage parseSkillPackage(byte[] bytes, Map<String, Object> manifest) {
        List<SkillFileEntry> files = new ArrayList<>();
        Map<String, byte[]> contentByPath = new TreeMap<>();
        long totalUncompressedBytes = 0;
        try (ZipInputStream zip = new ZipInputStream(new ByteArrayInputStream(bytes))) {
            ZipEntry entry;
            while ((entry = zip.getNextEntry()) != null) {
                if (entry.isDirectory()) {
                    continue;
                }
                if (files.size() >= maxFileCount) {
                    throw new IllegalArgumentException(
                            "Skill package exceeds max file count of " + maxFileCount);

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Check server disk space in the multipart temp location (spring.servlet.multipart.location).
  2. Increase client upload timeout and retry the upload.
  3. Inspect the caused-by IOException for the specific I/O error (No space left, file not found, etc.).

Example fix

// no code fix — operational recovery
# ensure temp dir has space and retry the upload
df -h /tmp
POST /api/skills/register (retry)
Defensive patterns

Strategy: retry

Try / catch

try { skillRegistryService.register(manifest, pkg); }
catch (IllegalArgumentException e) {
    if (e.getMessage().startsWith("Failed to read skill package")) {
        // check temp-dir disk space, then retry the upload
    } else throw e;
}

Prevention

When it happens

Trigger: POST /api/skills/register where Spring's multipart temp file was deleted mid-request, the temp dir is full or unwritable, or the client disconnected during upload leaving a partial temp file.

Common situations: Low disk space in the multipart temp directory; a reverse proxy timing out and closing the connection; container ephemeral storage exhaustion; the temp file cleaned up by another process during a slow upload.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/aa2ab64e9d64bb3c. Report an issue: GitHub.