---
url: >-
  https://adk.nht.io/api/@nhtio/adk/exceptions/variables/E_READER_NOT_DESCRIBABLE.md
description: >-
  Thrown when `encode()`-ing a reader-backed primitive ({@link
  @nhtio/adk!Media}, {@link @nhtio/adk!SpooledArtifact}) whose underlying reader
  cannot describe itself.
---

# Variable: E\_READER\_NOT\_DESCRIBABLE

```ts
const E_READER_NOT_DESCRIBABLE: CreatedException<[string]>;
```

Defined in: [src/lib/exceptions/runtime.ts:570](https://github.com/NHTIO/ADK/blob/v1.20260713.1/src/src/lib/exceptions/runtime.ts#L570)

Thrown when `encode()`-ing a reader-backed primitive ([@nhtio/adk!Media](../../common/classes/Media.md),
[@nhtio/adk!SpooledArtifact](../../spooled_artifact/classes/SpooledArtifact.md)) whose underlying reader cannot describe itself.

## Remarks

The encoder serialises reader-backed primitives as **handles**, not bytes: the reader emits a
`{ tag, locator }` descriptor (via its optional `describe()` method) and decode re-binds it through a
registered resolver. A reader with no `describe()` has no serialisable handle — there is nothing to
write down. The single printf argument names the offending field (e.g. `"reader"`).

This is deliberately not silent: dropping the reader would yield a `Media`/`SpooledArtifact` that
decodes into a handle pointing at nothing. The framework refuses to fabricate that. The canonical
trigger is a `fromWebFile`-backed `Media` — a browser `Blob` is not re-openable across a
serialisation boundary, and the encoder is synchronous so it cannot drain the bytes inline. Re-wrap
the bytes in a describable reader (e.g. persist to a spool/media store) before encoding.

Not fatal — an un-encodable value is a caller condition, not a runner failure.
