moeru-ai/airi · error · Error

inspection.errors.join(' ')

Error message

inspection.errors.join(' ')

What it means

`loadTachieZip` runs `inspectTachieArchive` which fully decodes images and collects per-entry errors. If inspection yields no `assets` (errors accumulated), `loadTachieZip` throws `new Error(inspection.errors.join(' '))`, concatenating every accumulated problem (e.g. failed image decodes, a missing neutral image). A failed archive never returns a partial model.

Source

Thrown at packages/stage-ui-tachie/src/utils/tachie-archive.ts:455

    errors,
    ignoredEntries: layout.ignoredEntries,
    warnings,
  }
}

/**
 * Loads and fully decodes every recognized emotion image in a Tachie ZIP.
 *
 * The returned image sources remain owned by the caller until `dispose()` is
 * called. A failed archive never returns a partially usable model.
 */
export async function loadTachieZip(
  input: Blob | ArrayBuffer,
  options: TachieArchiveLoadOptions = {},
): Promise<TachieLoadedAssets> {
  const inspection = await inspectTachieArchive(input, options)
  if (!inspection.assets)
    throw new Error(inspection.errors.join(' '))
  return inspection.assets
}

/**
 * Validates a local `.tachie.zip` without retaining decoded image resources.
 */
export async function validateTachieZip(file: File): Promise<TachieValidationReport> {
  const inspection = await inspectTachieArchive(file, {
    fileName: file.name,
    requireTachieSuffix: true,
  })
  const assets = inspection.assets
  const report: TachieValidationReport = {
    status: inspection.errors.length > 0
      ? 'INVALID'
      : inspection.warnings.length > 0
        ? 'WARNING'
        : 'VALID',

View on GitHub (pinned to 27111382b4)

Solutions

  1. Call `validateTachieZip(file)` (or `inspectTachieArchive`) first and read `inspection.errors` / the validation report for the specific failing entry.
  2. Replace or re-export the named failing image(s) the errors mention.
  3. Ensure the neutral emotion image is present and decodes cleanly.
  4. Re-create the `.tachie.zip` from source assets and retry.

Example fix

// before
const assets = await loadTachieZip(blob)  // throws joined errors

// after
const report = await validateTachieZip(file)
if (!report.assets) {
  console.error('Tachie archive rejected:', report.errors)
  return
}
const assets = await loadTachieZip(blob)
Defensive patterns

Strategy: try-catch

Validate before calling

const report = await validateTachieZip(file)
if (!report.assets) {
  throw new Error(`Tachie archive rejected: ${report.errors.join('; ')}`)
}
await loadTachieZip(blob)

Type guard

function isTachieValidationOk(report: TachieValidationReport): boolean {
  return !!report.assets && report.errors.length === 0
}

Try / catch

try {
  await loadTachieZip(blob)
} catch (e) {
  if (e instanceof Error && /decode|neutral image|could not/i.test(e.message)) {
    // surface the per-entry failures from validateTachieZip
  } else throw e
}

Prevention

When it happens

Trigger: A Tachie ZIP where one or more recognized emotion images failed to decode (corrupt PNG/unsupported format), or where the neutral (`DEFAULT_TACHIE_EMOTION`) image could not be decoded. `inspectTachieArchive` disposes decoded images and returns only an errors array, so the joined string is the only diagnostic.

Common situations: Corrupt image bytes inside the archive; an emotion image in an unsupported format; missing or unreadable neutral emotion image; partial/aborted archive creation; an image that exceeds decode limits.

Related errors


AI-assisted analysis of moeru-ai/airi@27111382b4 (2026-08-12). Data as JSON: /api/errors/1624aac4ad0a5bf3. Report an issue: GitHub.