> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usealmanac.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> This handbook preview targets personal CLI 0.11.1. Check installed command help and the matching backend schema before using examples with another release. Examples with named people and placeholder IDs are fictional.

# Read and continue web results

> Understand saved results, resource IDs, assets, cursors and a failed saved-result handoff.

A web command prints the CLI's [envelope](/cli/automation). Its `data` is the web result: `data.data` holds the source's native result; `resources` identify follow-up reads; `assets` identify retrievable files; `pagination` and `notices` describe scope. Do not assume two providers, or even two operations from the same provider, put their records at the same path inside `data.data`.

Every search or read is saved on the calling machine, and the envelope's `saved.path` names the file. Name the file yourself with `--output`:

```sh theme={"theme":{"light":"github-light","dark":"vesper"}}
almanac web search "Python asyncio documentation" --output search.json
almanac web read --from search.json --resource web:0 --output page.json
```

`search.json` then holds the complete envelope, including the result's `schema_version`, resources, assets and paging, and `saved.path` reports it. When the envelope is too large for stdout, stdout omits `data` but the file keeps it. Use a different filename if the file already exists; `--force` explicitly replaces it.

In a September 2026 search test, the saved result contained `schema_version: 1` and a resource named `web:0` targeting a Python documentation URL. `web:0` was an ID **inside that saved search result**, not a global page ID or a filename. `web read --from ... --resource ...` made a **new network read** of the selected target; it did not reveal page content already hidden in the search file. Inspect the actual resource and its `targets` before following it. An empty target list offers no next action. Only `web read` and `web download` take `--from`.

If `web read --from search.json --resource web:0` says `Expected a saved web search or read result`, inspect the named local file. The error alone cannot distinguish an absent file, malformed JSON and a different JSON shape. Do not guess its contents or overwrite it while diagnosing. Search again, follow the fresh `saved.path`, and check that it contains the desired resource ID.

Continue a collection only when `page.next_cursor` is present. Keep the same source, operation, identity and filters when passing `--cursor NEXT_CURSOR` (or `--cursor @search.json` to take it from a saved result); the cursor is a continuation, not an item ID. A null `has_more` or missing cursor does not prove the provider's entire collection was exhausted. Search results are discovery; read the original and retain its source URL before relying on its claims.
