Feedback Commands
Use these commands when you want to inspect, summarize, or extract the thumbs-up / thumbs-down feedback that gets recorded against a company's work — agent outputs, comments, and other targets that a reviewer voted on. The shortest route from "what did people actually think of this agent's work?" to a shareable artifact is paperclipai feedback report for a quick read and paperclipai feedback export to write a full bundle to disk. The trace and bundle subcommands fetch a single feedback record by ID for scripted workflows.
Feedback in Paperclip is captured as feedback traces. A trace records one vote against one target (its vote, its status, the issue it belongs to, a summary of what was voted on, and an optional reason), and it carries a payloadSnapshot plus a downloadable bundle of the underlying files. These commands read those traces through the API — the CLI never computes votes itself, it observes what the server already stored.
Command Summary
| Command | What it does |
|---|---|
feedback report |
Render a terminal report of a company's feedback traces, with a summary and per-trace details. |
feedback export |
Write votes plus raw trace bundles into a folder and a .zip archive. |
feedback trace <traceId> |
Fetch a single feedback trace by ID. |
feedback bundle <traceId> |
Fetch a single feedback trace's bundle (the trace plus its attached files). |
All four subcommands accept the common client options described in Common Options: --data-dir, --api-base, --api-key, --context, --profile, and --json. report and export are company-scoped and additionally take -C, --company-id <id>.
Note:
feedback reportandfeedback exportresolve the company from-C/--company-id, thenPAPERCLIP_COMPANY_ID, then your CLI context default. If none of those is set, the command falls back to the first company returned by the API. On an instance with more than one company, always pass--company-idso you export the company you mean.
Filtering Feedback Traces
report and export share the same filter flags. They narrow the set of traces the command reads from /api/companies/<company-id>/feedback-traces before it renders or writes anything.
| Flag | Use |
|---|---|
--target-type <type> |
Only include traces against this target type (for example a comment vs. a work product). |
--vote <vote> |
Only include traces with this vote value (up or down). |
--status <status> |
Only include traces in this export status (see the status table below). |
--project-id <id> |
Only include traces tied to this project. |
--issue-id <id> |
Only include traces tied to this issue. |
--from <iso8601> |
Only include traces created at or after this timestamp. |
--to <iso8601> |
Only include traces created at or before this timestamp. |
--shared-only |
Only include traces eligible for sharing/export. |
Use the time window and --shared-only together when you are preparing feedback to send outside the instance — it keeps the export to traces the server has marked as shareable, within the dates you care about.
Trace status values
Every trace carries an export status. The report tallies these four, and they tell you where each piece of feedback sits in the sharing pipeline:
| Status | Meaning |
|---|---|
pending |
Recorded and awaiting export/share. |
sent |
Already shared/exported off the instance. |
local_only |
Kept on this instance; not eligible to leave it. |
failed |
An export/share attempt failed. |
Report
feedback report reads the matching traces and prints a terminal report: a header with the server URL and company, a summary block, and a detail section for each trace.
paperclipai feedback report --company-id <company-id>
The summary counts thumbs up, thumbs down, downvotes that carried a written reason, and the total trace count, then breaks the traces down by export status. The detail section shows, per trace, the issue reference and title, a short trace ID, the status, the creation date, the target label, an excerpt of what was voted on, and the reason when one was given.
Narrow the report with any of the filter flags. For example, to look at just the downvotes for one project in the last week:
paperclipai feedback report \
--company-id <company-id> \
--vote down \
--project-id <project-id> \
--from 2026-05-25T00:00:00Z
To see the full raw payload for each trace inline, add --payloads:
paperclipai feedback report --company-id <company-id> --payloads
Tip:
--payloadsdumps the completepayloadSnapshotJSON under each trace. It is verbose — reach for it when you are debugging exactly what was captured, not for a routine read.
For machine consumption, pass --json. The command then prints a structured object with apiBase, companyId, the summary, and the full traces array instead of the formatted terminal report:
paperclipai feedback report --company-id <company-id> --json
Export
feedback export reads the matching traces, fetches each trace's bundle, and writes everything to a folder plus a sibling .zip archive. This is the command to use when feedback needs to leave the terminal — for a review, an archive, or a hand-off.
paperclipai feedback export --company-id <company-id> --out ./feedback/acme
If you omit --out, the command writes to ./feedback-export-<timestamp> in the current directory. The output directory must not already exist with files in it — the command refuses to write into a non-empty directory so it never clobbers a previous export.
What gets written
The export folder is laid out so you can read it by hand or feed it to another tool:
| Path | Contents |
|---|---|
index.json |
A manifest: when it was exported, the server URL, the company ID, a summary (counts plus uniqueIssues and the sorted list of issue identifiers), and the list of files written. |
votes/ |
One JSON file per trace holding a flattened vote record (vote, target, status, consent version, timestamps, and the reason). |
traces/ |
One JSON file per trace with the full trace object. |
full-traces/<issue>-<trace>/ |
One directory per trace containing bundle.json and every file from that trace's bundle, written out at its original relative path. |
<output-dir>.zip |
A stored (uncompressed) zip archive of index.json and every file above, rooted at the export folder name. |
File names are built from the issue identifier (for example PAP-39) and a short slice of the trace or vote ID, so the export is browsable without opening anything.
How export works for companies and issues
Export is always company-scoped: it pulls the traces for one company, then groups the resulting files by the issue each trace belongs to. The manifest's summary.uniqueIssues and summary.issues tell you exactly which issues are represented, and the per-file naming carries the issue identifier into votes/, traces/, and full-traces/. That means a single export answers both "how did this company's work score overall?" and "which issues drew the feedback?" without a second pass.
To export only what is shareable for a single issue:
paperclipai feedback export \
--company-id <company-id> \
--issue-id <issue-id> \
--shared-only \
--out ./feedback/<issue-id>
With --json, the command prints companyId, the resolved outputDir, the zipPath, and the export summary instead of the formatted summary:
paperclipai feedback export --company-id <company-id> --json
Trace
feedback trace fetches a single feedback trace by its ID. Use it when you already have a trace ID — from a report, an export, or another tool — and want the raw record.
paperclipai feedback trace <trace-id>
paperclipai feedback trace <trace-id> --json
This is a direct read of /api/feedback-traces/<trace-id> and is not company-scoped — the ID identifies the trace on its own.
Bundle
feedback bundle fetches a single trace's bundle: the trace plus the underlying files captured with it. This is the same material that feedback export writes into each full-traces/ directory, but fetched for one trace at a time.
paperclipai feedback bundle <trace-id>
paperclipai feedback bundle <trace-id> --json
Reach for bundle when you need the full context behind a single vote — the actual files that were voted on — without running a whole company export.
Scripting Notes
- Use
--jsonon every subcommand when you are piping intojqor another tool. See Output and Scripting for the conventions. report --jsonreturns the samesummaryshape thatexport --jsonreports, so you can dry-run a filter withreportbefore committing it to disk withexport.- Because
exportrefuses a non-empty--outdirectory, scripts should generate a fresh path (or rely on the default timestamped directory) per run.
See also
- Issue Commands — feedback traces are anchored to issues; use these to inspect the work that was voted on.
- Company Commands — feedback is company-scoped; export and portability live here.
- Common Options — the shared client flags every feedback subcommand accepts.
- Output and Scripting — how
--jsonoutput is structured for automation.