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

# Read the latest operator-facing progress reported by a running attempt.

> Progress is an exact `current / total` pair with an optional short status
message. Writes replace the previous report only under the current job lease and
fence. The report may outlive its writing attempt; `fence` identifies that
attempt and `updated_at_ms` is store-clock time. Ordinary job detail/list
responses omit progress messages.




## OpenAPI

````yaml /api/headgate.openapi.yaml get /jobs/{id}/progress
openapi: 3.1.0
info:
  title: headgate control API
  version: 0.1.0
  description: >
    The web UI is one client of this control API and gets no

    privileged access — asynqmon reads Redis directly, which is why its
    compatibility

    note is three minor versions stale.


    Both the Go and Rust implementations serve this spec, and the conformance
    suite

    asserts identical responses. Every list endpoint is bounded to prevent
    inspection

    from becoming an unbounded store operation: asynq's

    GetQueueInfo is O(number of groups) and has pinned Redis CPU for seconds in

    production. Monitoring caused the outage.


    DERIVED FROM THE ARCHITECTURE, NOT FROM A PREDECESSOR'S UI. The first draft
    of this

    spec was the asynq Inspector surface -- list by state, act on one job, pause
    a queue

    -- with new nouns bolted on. That inherited three problems: it omitted bulk

    operations, history, and enqueue (which asynq and apalis-board respectively
    DO have),

    and more importantly it had no endpoint for the question this system's own
    design

    creates. When dequeue is an admission decision, the operator's first
    question is not

    "what is in the queue" but "why is THIS job not running" -- see
    /jobs/{id}/admission.

    No predecessor needs that endpoint because no predecessor has a gate.
servers:
  - url: /api/v1
security: []
paths:
  /jobs/{id}/progress:
    get:
      summary: Read the latest operator-facing progress reported by a running attempt.
      description: >
        Progress is an exact `current / total` pair with an optional short
        status

        message. Writes replace the previous report only under the current job
        lease and

        fence. The report may outlive its writing attempt; `fence` identifies
        that

        attempt and `updated_at_ms` is store-clock time. Ordinary job
        detail/list

        responses omit progress messages.
      parameters:
        - $ref: '#/components/parameters/Id'
      responses:
        '200':
          description: Latest reported progress.
          content:
            application/json:
              schema:
                type: object
                required:
                  - current
                  - total
                  - message
                  - fence
                  - updated_at_ms
                properties:
                  current:
                    type: integer
                    minimum: 0
                    maximum: 9007199254740991
                  total:
                    type: integer
                    minimum: 1
                    maximum: 9007199254740991
                  message:
                    type:
                      - string
                      - 'null'
                    maxLength: 512
                  fence:
                    type: integer
                    minimum: 1
                  updated_at_ms:
                    type: integer
                    minimum: 1
        '404':
          description: Job missing or no progress was reported
        '501':
          description: Backend does not implement progress storage
components:
  parameters:
    Id:
      name: id
      in: path
      required: true
      schema:
        type: string

````