openapi: 3.0.3 info: title: Phase 3 Loading and Picking API version: 1.0.0 paths: /api/platform/v1/inbounds/{inboundId}/loading/picking/start: post: summary: Refresh the compatibility projection from canonical container PDA tasks deprecated: true description: expectedCount and pickedCount must exactly match the server-derived container-task aggregate. parameters: [{$ref: '#/components/parameters/InboundId'}, {$ref: '#/components/parameters/TenantId'}, {$ref: '#/components/parameters/IdempotencyKey'}] requestBody: required: true content: application/json: {schema: {$ref: '#/components/schemas/PickingRequest'}} responses: '200': {description: Business envelope containing IN_PROGRESS task} /api/platform/v1/inbounds/{inboundId}/loading/picking/complete: post: summary: Mark the compatibility projection complete after all container PDA tasks are reviewed deprecated: true description: This endpoint cannot complete canonical picking; counts must match the server aggregate and every related container task must already be completed. parameters: [{$ref: '#/components/parameters/InboundId'}, {$ref: '#/components/parameters/TenantId'}, {$ref: '#/components/parameters/IdempotencyKey'}] requestBody: required: true content: application/json: {schema: {$ref: '#/components/schemas/PickingRequest'}} responses: '200': {description: Business envelope containing COMPLETED task} /api/platform/v1/inbounds/{inboundId}/loading/picking: get: summary: Read the inbound-level PDA picking task parameters: [{$ref: '#/components/parameters/InboundId'}, {$ref: '#/components/parameters/TenantId'}] responses: '200': {description: Business envelope containing task or null} /api/platform/v1/inbounds/{inboundId}/loading/complete: post: summary: Compatibility endpoint for completing loading after the canonical PDA confirmation description: Canonical PDA confirmation atomically completes task, plan and inbound LOADED. This endpoint remains an idempotent server-side completion primitive; RELEASED booking, completed plan/picking and five ACTIVE evidence types remain hard gates. Truck status is not a prerequisite; the canonical PDA action completes the unique active appointment for the stable container booking when one exists. parameters: [{$ref: '#/components/parameters/InboundId'}, {$ref: '#/components/parameters/TenantId'}, {$ref: '#/components/parameters/IdempotencyKey'}] requestBody: required: true content: application/json: {schema: {$ref: '#/components/schemas/CompleteLoadingRequest'}} responses: '200': {description: Business envelope containing LOADED status} components: parameters: InboundId: {name: inboundId, in: path, required: true, schema: {type: integer, format: int64, minimum: 1}} TenantId: {name: tenantId, in: query, required: true, schema: {type: integer, format: int64, minimum: 1}} IdempotencyKey: {name: Idempotency-Key, in: header, required: true, schema: {type: string, maxLength: 128}} schemas: PickingRequest: type: object required: [expectedVersion, expectedCount, pickedCount] properties: expectedVersion: {type: integer, minimum: 0} expectedCount: {type: integer, minimum: 1} pickedCount: {type: integer, minimum: 0} remark: {type: string, maxLength: 1000} CompleteLoadingRequest: type: object required: [expectedVersion] properties: expectedVersion: {type: integer, minimum: 0} remark: {type: string, maxLength: 1000}