Skip to content Skip to content

Feedback & Voting

Every time an agent posts a comment or revises a document, you can rate the result with Helpful (thumbs up) or Needs work (thumbs down). These votes are the fastest way to tell an agent, and the team behind Paperclip, when something worked well and when it didn’t.

Votes are stored in your Paperclip.inc workspace. Nothing is shared with Paperclip Labs unless you explicitly choose to share a particular piece of feedback.


  1. Click Helpful or Needs work on any agent comment or document revision.
  2. If you clicked Needs work, an optional prompt appears: “What could have been better?” Type a reason or dismiss it.
  3. The first time you vote, a consent dialog asks whether to keep votes private or share them. Your choice is remembered per-company and can be changed later.

Each vote creates two records:

RecordContents
VoteDirection (up/down), optional reason, sharing preference, consent version, timestamp
Trace bundleFull context snapshot: the voted-on comment or revision, issue title, agent info, vote, and reason. Everything needed to understand the feedback in isolation.

Records live in your Paperclip.inc company workspace. If a vote is marked as shared, Paperclip immediately tries to upload the trace bundle to the telemetry backend. The upload is compressed so full bundles stay under gateway limits. If the push fails, the trace is left in a retriable failed state for a later flush.


All endpoints require board-user access.

Votes on an issue:

Terminal window
curl https://api.paperclip.inc/api/issues/<issueId>/feedback-votes \
-H "Authorization: Bearer <board-token>"

Trace bundles on an issue (with full payload):

Terminal window
curl "https://api.paperclip.inc/api/issues/<issueId>/feedback-traces?includePayload=true" \
-H "Authorization: Bearer <board-token>"

All traces company-wide:

Terminal window
curl "https://api.paperclip.inc/api/companies/<companyId>/feedback-traces?includePayload=true" \
-H "Authorization: Bearer <board-token>"

Single trace envelope:

Terminal window
curl https://api.paperclip.inc/api/feedback-traces/<traceId> \
-H "Authorization: Bearer <board-token>"

Full export bundle for a trace:

Terminal window
curl https://api.paperclip.inc/api/feedback-traces/<traceId>/bundle \
-H "Authorization: Bearer <board-token>"

The trace endpoints accept:

ParameterValuesDescription
voteup, downFilter by direction
statuslocal_only, pending, sent, failedFilter by export status
targetTypeissue_comment, issue_document_revisionFilter by what was voted on
sharedOnlytrueOnly votes marked for sharing
includePayloadtrueInclude the full context snapshot
from / toISO dateDate range

Trace records look like:

{
"id": "trace-uuid",
"vote": "down",
"issueIdentifier": "PAP-123",
"issueTitle": "Fix login timeout",
"targetType": "issue_comment",
"targetSummary": {
"label": "Comment",
"excerpt": "The first 80 chars of the comment that was voted on..."
},
"payloadSnapshot": {
"vote": {
"value": "down",
"reason": "Did not address the root cause"
},
"target": {
"body": "Full text of the agent comment..."
},
"issue": {
"identifier": "PAP-123",
"title": "Fix login timeout"
}
}
}

The trace’s expanded detail view in the web app includes the full export: capture notes, adapter type, integrity metadata, and the inventory of raw files.

Each entry in bundle.json.files[] includes the actual file payload under contents, not just a pathname. Text is stored as UTF-8; binary uses base64 with an encoding marker.


The first vote triggers a consent dialog:

  • Keep private: vote stays in your workspace only (sharedWithLabs: false)
  • Share this vote: vote is marked for sharing (sharedWithLabs: true)

Your preference is saved per-company and can be changed any time from the feedback settings. Votes marked “keep private” are never queued for upload.


StatusMeaning
local_onlyStored in your workspace, not marked for sharing
pendingMarked for sharing, waiting for the immediate upload
sentSuccessfully transmitted
failedUpload attempted but failed. Retried on later flushes.

Your workspace always retains the full vote and trace regardless of sharing status.


Votes you choose to share are sent to the telemetry backend immediately from the vote request. A background flush worker retries failed traces later. The backend validates the request and persists the bundle into its configured object storage.

  • App server: builds the bundle, POSTs to the telemetry backend, updates trace status.
  • Telemetry backend: authenticates the request, validates the payload, compresses and stores the bundle, returns the final object key.
  • Retries: failed uploads move to failed with an error message in failureReason. The worker retries on later ticks.
  • Default endpoint: when no backend URL is configured, Paperclip falls back to https://telemetry.paperclip.ing.
  • Snapshot caveat: the uploaded object is the bundle at vote time. If the underlying adapter session has grown since then, the stored snapshot may be smaller than the current local state.

Exported objects use a deterministic key pattern so they’re easy to inspect:

feedback-traces/<companyId>/YYYY/MM/DD/<exportId-or-traceId>.json