---
name: file-presentation
description: "Deliver a file or document to the owner inside chat for review and download. Triggers when the owner asks to see, attach, or download a file, when content is generated that the owner needs to review (summary, report, draft), or when a downloadable artefact is the right output."
---

# File presentation

Invoked by the admin agent directly.

This skill covers presenting editable content for inline review before it is persisted, and delivering a finished file to the owner. Deliver by inventory, not by recipe. On a turn that arrived over a message channel (web chat, WhatsApp, Telegram), the native `SendUserFile` tool is your file-sending path: call it with the file's path and the platform forwards the file to that conversation as a real attachment — do not paste the file's contents as a fallback. If you cannot send it yourself (for example you are a specialist running as a subagent), write the file under `output/` and state its full path in your result; the main session delivers it to the owner. On the admin dashboard, an `output/` file also appears in the Artefacts panel and on the file share.

## The trigger

The owner asks to view, review, attach, or download a file or a document, or the current turn produces a document the owner needs to see. Example phrasings:

- "show me the file"
- "attach the report"
- "let me download that"
- "preview the document"
- "send me the brochure"
- "save that as a markdown file"

## How to deliver markdown text content

For a synthesised document (a summary, a report, a draft, a knowledge-base article), present the content as a single fenced markdown block in chat:

````
```markdown
<the file content as markdown>
```
````

The operator reads the block inline, copy-edits in their next message if changes are needed, and approves before any persistence step. Do not call `memory-write`, `memory-ingest`, or other writers before the operator has approved the content; those tools have different purposes and skipping the review step takes control away from the owner.

When the operator approves and the document should land on disk or in the graph, use the appropriate writer (`store-skill` for skill files under the active account, the relevant graph writer for `:KnowledgeDocument` nodes). Always state the destination before writing.

## For static-site delivery

When the owner has uploaded a `.zip` containing HTML and assets and wants it hosted, this skill is not the right path. Delegate to `content-producer` on turn one; the specialist owns the `unzip-attachment` then `publish-site` chain.

## Failure modes

- **Content is too large for one chat block** (typically over 50,000 characters of markdown). Surface the size and offer to split into sections, or save it as a `.md` file under `output/` and deliver that instead of pasting it.
- **The file write fails** (permission, disk, bad path). Surface the error literally and the path you tried. Do not claim a file was delivered when the write did not succeed.
- **Do not** paste binary contents or a base64 dump into chat as a "delivery" fallback; the owner asked for a file, not a wall of bytes. Deliver the file itself.

## What this skill does not do

It does not write content to the graph or to disk on its own. The fenced-block path is a review surface; persistence is a separate, named tool call that follows operator approval.
