{
  "schema": "lockwell.native-wire.v1",
  "status": "experimental",
  "defaultEnabled": false,
  "byteOrder": "big-endian",
  "magicHex": "4c4b5731",
  "version": 1,
  "headerBytes": 40,
  "checksum": "crc32c",
  "transportSecurity": {
    "nonLoopbackMinimumTls": "1.3",
    "hostnameVerification": "required",
    "clientAuthentication": [
      "none",
      "optional-mtls",
      "required-mtls"
    ],
    "applicationEncryption": "none-tls-1.3-is-the-documented-boundary"
  },
  "defaultLimits": {
    "metadataBytes": 65536,
    "payloadBytesPerFrame": 1048576,
    "frameBytes": 1114156,
    "streamsPerConnection": 128,
    "connections": 1024,
    "streamWindowBytes": 4194304,
    "connectionWindowBytes": 16777216,
    "authenticationSkewSeconds": 300,
    "replayMaxPrincipals": 1024,
    "replayNoncesPerPrincipal": 256,
    "authRetryAfterMaximumMillis": 600000,
    "handshakeSourceMode": "off",
    "directPeerHandshakeRate": 256,
    "directPeerHandshakeWindowMillis": 60000,
    "directPeerHandshakeMaxSources": 4096
  },
  "frameTypes": {
    "HELLO": 1,
    "WELCOME": 2,
    "AUTH": 3,
    "AUTH_OK": 4,
    "AUTH_ERROR": 5,
    "REQUEST": 16,
    "DATA": 17,
    "END": 18,
    "CANCEL": 19,
    "RESPONSE": 32,
    "ERROR": 33,
    "WINDOW_UPDATE": 48,
    "PING": 49,
    "PONG": 50,
    "GOAWAY": 51,
    "CLOSE": 52
  },
  "handshakeMetadata": {
    "HELLO_WELCOME": {
      "MIN_VERSION": 1,
      "MAX_VERSION": 2,
      "CAPABILITIES": 3,
      "MAX_METADATA_BYTES": 4,
      "MAX_PAYLOAD_BYTES": 5,
      "MAX_STREAMS": 6,
      "STREAM_WINDOW_BYTES": 7,
      "CONNECTION_WINDOW_BYTES": 8
    },
    "AUTH": {
      "ACCESS_KEY_ID": 1,
      "TIMESTAMP_MILLIS": 2,
      "NONCE": 3,
      "PROOF": 4
    },
    "AUTH_OK": {
      "TENANT_ID": 1,
      "SESSION_ID": 2,
      "EXPIRES_AT_MILLIS": 3,
      "CAPABILITIES": 4,
      "MAX_METADATA_BYTES": 5,
      "MAX_PAYLOAD_BYTES": 6,
      "MAX_STREAMS": 7,
      "STREAM_WINDOW_BYTES": 8,
      "CONNECTION_WINDOW_BYTES": 9
    }
  },
  "requestMetadataFields": {
    "BUCKET": 1,
    "KEY": 2,
    "VERSION_ID": 3,
    "CONTENT_TYPE": 4,
    "CONTENT_LENGTH": 5,
    "CURSOR": 6,
    "PREFIX": 7,
    "DELIMITER": 8,
    "MAX_KEYS": 9,
    "UPLOAD_ID": 10,
    "PART_NUMBER": 11,
    "ETAG": 12,
    "STATE": 13,
    "RETAIN_UNTIL": 14,
    "LEGAL_HOLD": 15,
    "SOURCE_BUCKET": 16,
    "SOURCE_KEY": 17,
    "DOCUMENT": 50,
    "USER_METADATA": 51,
    "IDEMPOTENCY_KEY": 52,
    "IF_MATCH": 53,
    "IF_NONE_MATCH": 54,
    "RANGE_START": 55,
    "RANGE_END": 56,
    "CHECKSUM_ALGORITHM": 57,
    "CHECKSUM_VALUE": 58,
    "TRACEPARENT": 59,
    "KEY_MARKER": 60,
    "VERSION_ID_MARKER": 61,
    "RETENTION_MODE": 62,
    "OBJECT_LOCK_ENABLED": 63,
    "DEADLINE_MILLIS": 32512
  },
  "responseMetadataFields": {
    "STATUS": 100,
    "ETAG": 101,
    "VERSION_ID": 102,
    "CONTENT_LENGTH": 103,
    "CONTENT_TYPE": 104,
    "REQUEST_ID": 105,
    "TRACEPARENT": 106,
    "LAST_MODIFIED": 107,
    "DELETE_MARKER": 108,
    "RETAIN_UNTIL": 109,
    "LEGAL_HOLD": 110,
    "USER_METADATA": 111
  },
  "capabilities": {
    "BUCKETS": 1,
    "OBJECTS": 2,
    "PAGINATION": 4,
    "MULTIPART": 8,
    "VERSIONING": 16,
    "OBJECT_LOCK": 32,
    "TAGS": 64,
    "SSE_C": 128,
    "SIGNED_CAPABILITY": 256,
    "TRACE_CONTEXT": 512,
    "CORS": 1024,
    "NOTIFICATIONS": 2048
  },
  "operations": {
    "CAPABILITIES": 1,
    "READINESS": 2,
    "CREATE_BUCKET": 256,
    "GET_BUCKET": 257,
    "LIST_BUCKETS": 258,
    "DELETE_BUCKET": 259,
    "PUT_BUCKET_VERSIONING": 260,
    "GET_BUCKET_VERSIONING": 261,
    "PUT_OBJECT": 512,
    "GET_OBJECT": 513,
    "HEAD_OBJECT": 514,
    "LIST_OBJECTS": 515,
    "DELETE_OBJECT": 516,
    "COPY_OBJECT": 517,
    "LIST_OBJECT_VERSIONS": 518,
    "BATCH_DELETE_OBJECTS": 519,
    "CREATE_MULTIPART": 768,
    "UPLOAD_PART": 769,
    "LIST_PARTS": 770,
    "COMPLETE_MULTIPART": 771,
    "ABORT_MULTIPART": 772,
    "LIST_MULTIPART_UPLOADS": 773,
    "GET_TAGS": 1024,
    "PUT_TAGS": 1025,
    "DELETE_TAGS": 1026,
    "GET_RETENTION": 1280,
    "PUT_RETENTION": 1281,
    "GET_LEGAL_HOLD": 1282,
    "PUT_LEGAL_HOLD": 1283,
    "MINT_SIGNED_CAPABILITY": 1536,
    "GET_BUCKET_CORS": 1792,
    "PUT_BUCKET_CORS": 1793,
    "DELETE_BUCKET_CORS": 1794,
    "GET_BUCKET_NOTIFICATIONS": 1808,
    "PUT_BUCKET_NOTIFICATIONS": 1809,
    "DELETE_BUCKET_NOTIFICATIONS": 1810
  },
  "operationSchemas": {
    "CREATE_BUCKET": {
      "capability": "BUCKETS",
      "requestMetadata": [
        "FieldBucket",
        "FieldState?",
        "FieldObjectLockEnabled?"
      ],
      "objectLockContract": "true enables versioning and immutable bucket Object Lock at creation"
    },
    "PUT_OBJECT": {
      "capability": "OBJECTS",
      "requestMetadataAdditions": [
        "FieldRetentionMode?",
        "FieldRetainUntil?",
        "FieldLegalHold?"
      ],
      "objectLockContract": "mode and retain-until are paired; legal hold is independent; all are authorized and committed atomically with the new version"
    },
    "BATCH_DELETE_OBJECTS": {
      "capability": "OBJECTS",
      "requestMetadata": [
        "FieldBucket",
        "FieldDocument"
      ],
      "requestDocument": {
        "objects": [
          {
            "key": "string",
            "versionId": "string?"
          }
        ]
      },
      "responseDocument": {
        "deleted": [
          {
            "key": "string",
            "versionId": "string?",
            "deleteMarker": "bool?",
            "deleteMarkerVersionId": "string?"
          }
        ],
        "errors": [
          {
            "key": "string",
            "code": "string",
            "message": "string"
          }
        ]
      },
      "limits": {
        "objects": 1000
      }
    },
    "GET_BUCKET_CORS": {
      "capability": "CORS",
      "requestMetadata": [
        "FieldBucket"
      ],
      "responseDocument": "CORSConfiguration"
    },
    "PUT_BUCKET_CORS": {
      "capability": "CORS",
      "requestMetadata": [
        "FieldBucket",
        "FieldDocument"
      ],
      "requestDocument": "CORSConfiguration",
      "responseDocument": "CORSConfiguration"
    },
    "DELETE_BUCKET_CORS": {
      "capability": "CORS",
      "requestMetadata": [
        "FieldBucket"
      ],
      "responseDocument": null
    },
    "GET_BUCKET_NOTIFICATIONS": {
      "capability": "NOTIFICATIONS",
      "requestMetadata": [
        "FieldBucket"
      ],
      "responseDocument": "NotificationConfiguration"
    },
    "PUT_BUCKET_NOTIFICATIONS": {
      "capability": "NOTIFICATIONS",
      "requestMetadata": [
        "FieldBucket",
        "FieldDocument"
      ],
      "requestDocument": "NotificationConfiguration",
      "responseDocument": "NotificationConfigurationWithOneTimeSigningSecret"
    },
    "DELETE_BUCKET_NOTIFICATIONS": {
      "capability": "NOTIFICATIONS",
      "requestMetadata": [
        "FieldBucket"
      ],
      "responseDocument": null
    }
  },
  "documents": {
    "CORSConfiguration": {
      "rules": [
        {
          "id": "string?",
          "allowedOrigins": [
            "string"
          ],
          "allowedMethods": [
            "string"
          ],
          "allowedHeaders": [
            "string"
          ],
          "exposeHeaders": [
            "string"
          ],
          "maxAgeSeconds": "u64"
        }
      ]
    },
    "NotificationConfiguration": {
      "configs": [
        {
          "id": "string?",
          "target": "webhook?",
          "webhookUrl": "string",
          "events": [
            "string"
          ],
          "filters": [
            {
              "name": "prefix|suffix",
              "value": "string"
            }
          ],
          "hasSecret": "bool?"
        }
      ]
    },
    "NotificationConfigurationWithOneTimeSigningSecret": {
      "note": "same as NotificationConfiguration; a newly created config additionally returns signingSecret exactly once"
    }
  },
  "errors": {
    "MALFORMED_FRAME": 1,
    "PROTOCOL_VERSION": 2,
    "UNSUPPORTED_FRAME": 3,
    "UNSUPPORTED_FIELD": 4,
    "UNSUPPORTED_OPERATION": 5,
    "FLOW_CONTROL": 6,
    "AUTH_REQUIRED": 256,
    "AUTH_FAILED": 257,
    "AUTH_EXPIRED": 258,
    "AUTH_REPLAY": 259,
    "ACCESS_REVOKED": 260,
    "TENANT_DISABLED": 261,
    "SCOPE_DENIED": 262,
    "INVALID_ARGUMENT": 512,
    "NOT_FOUND": 513,
    "ALREADY_EXISTS": 514,
    "PRECONDITION_FAILED": 515,
    "RETENTION_DENIED": 516,
    "LEGAL_HOLD_DENIED": 517,
    "QUOTA_EXCEEDED": 518,
    "CHECKSUM_MISMATCH": 519,
    "TOO_LARGE": 520,
    "RATE_LIMITED": 768,
    "UNAVAILABLE": 769,
    "DEADLINE_EXCEEDED": 770,
    "CANCELLED": 771,
    "DRAINING": 772,
    "INTERNAL": 1023
  },
  "authErrorMetadata": {
    "1": {
      "name": "retryable",
      "type": "bool",
      "required": true
    },
    "2": {
      "name": "retryAfterMillis",
      "type": "u64",
      "required": false,
      "maximum": 600000
    },
    "3": {
      "name": "message",
      "type": "utf8",
      "required": true,
      "maximumBytes": 512
    },
    "retryContract": "Replay-capacity exhaustion uses the existing RATE_LIMITED code and is retryable. Discard the failed connection, bound the delay by the client deadline/policy, resolve credentials again, and use a fresh timestamp, nonce, and proof. AUTH_REPLAY is never retryable."
  },
  "preTLSAdmission": {
    "mode": "direct-peer-only-opt-in",
    "overLimitBehavior": "close transport without AUTH_ERROR because TLS and LNW version negotiation have not completed",
    "stateCapacityBehavior": "admit without tracking; authentication and replay controls remain enforced",
    "proxyContract": "no forwarded-header or PROXY-protocol source identity is accepted"
  },
  "lockwelldImplementation": {
    "advertisedCapabilities": [
      "BUCKETS",
      "OBJECTS",
      "PAGINATION",
      "MULTIPART",
      "VERSIONING",
      "OBJECT_LOCK",
      "TAGS",
      "SIGNED_CAPABILITY",
      "TRACE_CONTEXT",
      "CORS",
      "NOTIFICATIONS"
    ],
    "excludedCapabilities": {
      "SSE_C": "the native data plane has no enforced SSE-C domain path"
    },
    "readiness": "authenticated and metadata-authority/quorum guarded"
  },
  "compatibility": {
    "unknownOptionalField": "skip",
    "unknownCriticalField": "reject-stream",
    "unknownFrameType": "goaway-and-close",
    "unknownOperation": "typed-stream-error",
    "codeReuse": "forbidden",
    "downgrade": "forbidden"
  },
  "reserved": {
    "ADMIN_CAPABILITY_BIT_INDEX": 16,
    "ADMIN_CAPABILITY_MASK": 65536,
    "ADMIN_OPERATION_RANGE": "0x1000-0x10ff",
    "status": "unimplemented-distinct-auth-contract-required"
  }
}
