# Share What a Factory Droid Produced — Output From a Machine You Can't Reach

Canonical: https://commareports.com/agents/share-factory-droid-output
Published: 2026-09-09

> A droid runs its task in Factory's environment and writes the plan, the migration report, the RCA there. Have it publish to a URL you own, with anchored comments it can read back.

# Share what a Factory droid produced

A droid does the work somewhere you cannot `cd` into. It plans the migration,
runs it, writes the RCA — and the document exists in an environment whose
filesystem is not yours. This is the same shape as
[Devin](/agents/share-devin-output),
[Jules](/agents/share-jules-output) and
[OpenHands](/agents/share-openhands-output): the last mile isn't a formatting
problem, it's a reachability problem.

Reading it in the session view works for you. It does not work for the team
that owns the service, the incident channel that wants the RCA, or the manager
who asked for the estimate — and it gives none of them a place to write "this
step will page the on-call at 3am".

## Have the droid publish it

Give the droid a [scoped token](/docs/api-tokens) as an environment secret and
put the standing rule in `AGENTS.md`, which is the instruction file the droid
already reads:

```md
## Publishing finished work

When you finish something a human needs to read — a migration report, an RCA, a
plan, an upgrade summary — publish it to Comma as an HTML report and include
the URL in your final summary. Do not paste the whole document into the
summary.

Publish with:

    curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
      -H "Authorization: Bearer $COMMA_API_TOKEN" \
      -H "Content-Type: application/json" \
      -d "$(jq -n --rawfile html report.html --arg title "$TITLE" \
            '{title: $title, html: $html}')"
```

The task now ends with a link instead of an artifact stranded in a container.

## Why this matters more for remote agents

- **There is no file to copy.** For a local agent, publishing is a convenience.
  For a droid, the alternative is asking a human to fetch the output through a
  UI, which is the manual step you bought the agent to remove.
- **The output outlives the session.** Environments get reclaimed; a report URL
  does not.
- **Comments reach the next run.** A reviewer writes "don't drop that column,
  reporting still reads it" on the step it belongs to, and the droid can read
  it back over the same API — see
  [letting an agent respond to comments](/agents/let-an-agent-respond-to-comments)
  and [giving an agent feedback](/agents/give-an-agent-feedback).
- **It renders.** Tables, diffs, generated diagrams — served verbatim in a
  sandboxed iframe.
- **Revisions make long tasks reviewable.** One id, one URL, a version per
  pass.

## Worth knowing

- **`reports:write` and nothing more**, for a token that lives in a remote
  environment — see
  [scoped tokens for AI agents](/agents/scoped-tokens-for-ai-agents).
- **Don't fan out onto one id.** Parallel droids PATCHing the same report race;
  give each its own, or publish once from a summary step.
- **Rate limit: 60 requests/minute per token.**
- **Publish private by default** and widen after a human has read it — a droid
  with repository access has quoted your code — see
  [sharing & access control](/docs/sharing).

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision
history.

**[Publish your first report →](https://commareports.com/)**

### Related

- [Where should my agent post?](/agents/where-should-my-agent-post)
- [Share what Devin produced](/agents/share-devin-output) ·
  [Share what OpenHands produced](/agents/share-openhands-output)
- [Scoped tokens for AI agents](/agents/scoped-tokens-for-ai-agents) ·
  [The API](/docs/api)
