---
title: "Prepare feedback for an admitted item review"
method: POST
path: "/internal/llm/prepare-feedback"
tags: ["result-admission"]
---

# Prepare feedback for an admitted item review

`POST /internal/llm/prepare-feedback`

## Request

- Base URL: `/` (relative, and the document was published on a file host, not at the API’s origin)
- URL: `/internal/llm/prepare-feedback`
- Auth: HTTP bearer

Requires the same fenced worker credential and admitted ITEM review. Preparation persists the package before a provider write.

## Request body

- PrepareFeedbackRequest
  - `attempt` integer, required
  - `basisResultIds` string[], required
  - `composition` ComposedFeedback[], required
    - `destination` 'ON_WORK' | 'PRACTICE_PAGE' | 'CONVERSATION'
    - `notes` Note[]
      - `body` string
      - `citationIndex` integer, required
      - `problemId` string, uuid
    - `page` Page
      - `body` string
      - `nextStep` string
      - `title` string
    - `resultIds` string[]
    - `summary` string
    - `trace` FeedbackCompositionTrace: Exact support and quiet decisions retained with the immutable preparation receipt. A public piece also retains the publication context of the history read it was composed from; the server sets it, never the composer.
      - `copies` CopySupport[]
        - `basedOn` Support[]
          - `problemId` string, uuid
          - `resultId` string, uuid
        - `kind` 'SUMMARY' | 'LINE_NOTE' | 'FILE_NOTE' | 'CHAT_TURN'
        - `position` integer
      - `primaryResultId` string, uuid
      - `publicationContext` string
      - `replacesId` string, uuid
      - `withheld` QuietDecision[]
        - `basedOn` Support[]
          - `problemId` string, uuid
          - `resultId` string, uuid
        - `reason` string
        - `witnessIds` string[]
    - `withheldReason` 'VOLUME_CAPPED' | 'COMPOSER_WITHHELD' | 'NOTHING_NEW' | 'REPEATS_DELIVERED_NOTE' | 'REACTED_DISAGREE' | 'REACTED_NOT_APPLICABLE' | 'CONVERSATION_EXPIRED' | 'DELIVERY_UNCONFIRMED' | 'ITEM_GONE' | 'ITEM_CLOSED' | 'ITEM_MERGED' | 'ITEM_STATE_INELIGIBLE' | 'ISSUE_SNAPSHOT_CHANGED' | 'PUBLIC_SUBJECT_INELIGIBLE' | 'NO_AI' | 'DELIVERY_OFF' | 'PERSON_SUPPRESSED' | 'RECIPIENT_UNAVAILABLE' | 'EMPTY_AFTER_SANITIZE' | 'INSTANCE_SILENCED' | 'FEEDBACK_OFF' | 'WORKSPACE_DISABLED' | 'WORKSPACE_DELIVERY_PAUSED' | 'STALE_ROLLOUT_REVISION' | 'OUTSIDE_CURRENT_SCOPE' | 'APPROVAL_STALE' | 'APPROVAL_NO_LONGER_ELIGIBLE' | 'PRACTICE_REQUIRES_APPROVAL' | 'BACKFILL_QUIET' | 'RESULT_MARKED_INCORRECT' | 'REVIEWED_VERSION_CHANGED' | 'REVIEW_CANCELLED' | 'EVIDENCE_NOT_PERMITTED' | 'NO_EVIDENCE' | 'UNCORROBORATED' | 'PUBLIC_HISTORY_CHANGED' | 'PUBLIC_DELIVERY_UNRESOLVED'
  - `jobId` string, uuid, required
  - `publicComposition` boolean, required
  - `publicationContext` string, nullable, required
  - `reviewId` string, uuid, required

## Response `200`

OK

- PrepareFeedbackResponse
  - `contentDigest` string, required
  - `feedbackIds` string[], required
  - `preparedAt` string, date-time, required

## Changes

- **2026-10-18** `1db7a5af415c`: 1 breaking, 3 info
  - added the new required request property `publicationContext`
  - added the new optional request property `composition/items/trace/publicationContext`
  - added the new `PUBLIC_DELIVERY_UNRESOLVED` enum value to the request property `composition/items/withheldReason`
  - added the new `PUBLIC_HISTORY_CHANGED` enum value to the request property `composition/items/withheldReason`
- **2026-10-17** `4b8a89bf492c`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/hephaestus-build/apis/hephaestus-api/changes/internal/llm/prepare-feedback/post.md)

---

[API](https://skmtc.dev/hephaestus-build/apis/hephaestus-api.md) · [All operations](https://skmtc.dev/hephaestus-build/apis/hephaestus-api/llms.txt) · [OpenAPI document](https://skmtc.dev/hephaestus-build/apis/hephaestus-api/revisions/3592ab716973?raw)
