> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tai42.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Delete a conversation person

> Erase a LINKED person ENTIRELY, forgetting every store that names it:

- the person's aggregated ``bridge:@person:{person_id}`` thread — its agent checkpoint,
  and across EVERY route the person wrote under its answer records, per-thread transcript
  indexes, route-thread index memberships and per-thread mode override (the thread-delete
  machinery, reused);
- the person row ``conversations:person:{person_id}``;
- every ``person_index`` ``door_address_key → person_id`` mapping of its addresses.

Caller authority is the door's grantable ``write`` action — the same grant that forgets a
thread. IDEMPOTENT and retryable: the person row is the durable marker of an owed erase and
is deleted LAST (atomically with its index mappings), so an interruption re-reads it and a
retry FINISHES. A person that is already gone (a retry, or one that never existed) is not a
404 — its aggregated checkpoint is forgotten regardless (it defaults to keep-forever) and
the call answers ``erased=false``. A turn IN FLIGHT on the aggregated thread is a 409
(retry once it drains), re-checked under the per-thread FIFO before any teardown so an
admitted turn cannot re-create memory behind the erase; a full queue is the retriable 503.
As a live-caller sync door the acquisition is bounded by ``sync_door_wait_seconds`` (both the
linked and the already-gone branch): a wait past it — behind a turn possibly HITL-paused on
another worker — is the loud, retriable 503 ``ThreadBusyError`` rather than a block past the
proxy timeout. A blank ``person_id`` is a 400; no backend is a loud 501.

Returns ``{"person_id", "removed", "erased"}``, where ``removed`` counts the answer records
this call deleted across the person's routes and ``erased`` says whether THIS call removed
the person row.



## OpenAPI

````yaml /openapi.json delete /api/conversations/persons/{person_id}
openapi: 3.1.0
info:
  description: The operator HTTP surface served under /api/*.
  title: tai42-skeleton API
  version: 14.0.2
servers: []
security: []
paths:
  /api/conversations/persons/{person_id}:
    delete:
      tags:
        - conversations
      summary: Delete a conversation person
      description: >-
        Erase a LINKED person ENTIRELY, forgetting every store that names it:


        - the person's aggregated ``bridge:@person:{person_id}`` thread — its
        agent checkpoint,
          and across EVERY route the person wrote under its answer records, per-thread transcript
          indexes, route-thread index memberships and per-thread mode override (the thread-delete
          machinery, reused);
        - the person row ``conversations:person:{person_id}``;

        - every ``person_index`` ``door_address_key → person_id`` mapping of its
        addresses.


        Caller authority is the door's grantable ``write`` action — the same
        grant that forgets a

        thread. IDEMPOTENT and retryable: the person row is the durable marker
        of an owed erase and

        is deleted LAST (atomically with its index mappings), so an interruption
        re-reads it and a

        retry FINISHES. A person that is already gone (a retry, or one that
        never existed) is not a

        404 — its aggregated checkpoint is forgotten regardless (it defaults to
        keep-forever) and

        the call answers ``erased=false``. A turn IN FLIGHT on the aggregated
        thread is a 409

        (retry once it drains), re-checked under the per-thread FIFO before any
        teardown so an

        admitted turn cannot re-create memory behind the erase; a full queue is
        the retriable 503.

        As a live-caller sync door the acquisition is bounded by
        ``sync_door_wait_seconds`` (both the

        linked and the already-gone branch): a wait past it — behind a turn
        possibly HITL-paused on

        another worker — is the loud, retriable 503 ``ThreadBusyError`` rather
        than a block past the

        proxy timeout. A blank ``person_id`` is a 400; no backend is a loud 501.


        Returns ``{"person_id", "removed", "erased"}``, where ``removed`` counts
        the answer records

        this call deleted across the person's routes and ``erased`` says whether
        THIS call removed

        the person row.
      operationId: delete_api_conversations_persons_person_id
      parameters:
        - in: path
          name: person_id
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/PersonDeleteResult'
                required:
                  - data
                type: object
          description: Success.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Malformed request.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Missing or invalid api key.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Conflict with the current resource state.
        '501':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Error.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: >-
            A dependency this route needs is temporarily unavailable; retry
            shortly.
      security:
        - ApiKeyAuth: []
components:
  schemas:
    PersonDeleteResult:
      description: >-
        A person erase. ``removed`` counts the answer records deleted across the
        person's

        routes; ``erased`` says whether THIS call removed the person row.
      properties:
        erased:
          title: Erased
          type: boolean
        person_id:
          title: Person Id
          type: string
        removed:
          title: Removed
          type: integer
      required:
        - person_id
        - removed
        - erased
      title: PersonDeleteResult
      type: object
    Error:
      properties:
        code:
          description: >-
            Stable machine-readable reason a client keys a dedicated error state
            on, present on refusals that opt in (e.g. a 501 not-configured
            refusal). Optional: absent when the error carries only a
            human-readable message.
          type: string
        error:
          type: string
      required:
        - error
      type: object
  securitySchemes:
    ApiKeyAuth:
      in: header
      name: x-api-key
      type: apiKey

````