Skip to content

chore(api): sync OpenAPI contract - #5

Draft
kong[bot] wants to merge 1 commit into
mainfrom
chore/sync-openapi
Draft

kong[bot] wants to merge 1 commit into
mainfrom
chore/sync-openapi

Conversation

@kong

@kong kong Bot commented Aug 30, 2026 •

Copy link
Copy Markdown

Summary

API change report

Public API

New Endpoints: 87


GET /connectors
POST /connectors
DELETE /connectors/{connector_id}
GET /connectors/{connector_id}
POST /durable-callbacks
POST /durable-callbacks/fail
POST /durable-callbacks/heartbeat
POST /durable-callbacks/succeed
POST /forks
POST /issues
GET /lavaflow/connector-bindings
POST /lavaflow/connector-bindings
DELETE /lavaflow/connector-bindings/{binding_id}
POST /lavaflow/held-fix-opens
GET /lavaflow/resources
GET /lavaflow/runs
POST /lavaflow/runs
GET /lavaflow/runs/{run_id}
GET /lavaflow/scans
GET /lavaflow/settings
PATCH /lavaflow/settings
GET /lavaflow/stats
GET /projects/{id}/capabilities
GET /projects/{id}/databases/{databaseName}/migration-runs
POST /projects/{id}/databases/{databaseName}/migration-runs
GET /projects/{id}/databases/{databaseName}/migration-runs/{runId}
GET /projects/{id}/databases/{databaseName}/migrations
POST /projects/{id}/databases/{databaseName}/migrations/baseline
GET /projects/{id}/frontends/{frontendId}/candidates
POST /projects/{id}/frontends/{frontendId}/candidates
DELETE /projects/{id}/frontends/{frontendId}/candidates/{candidateId}
GET /projects/{id}/frontends/{frontendId}/candidates/{candidateId}
POST /projects/{id}/frontends/{frontendId}/candidates/{candidateId}/deployments
POST /projects/{id}/frontends/{frontendId}/candidates/{candidateId}/promote
POST /projects/{id}/frontends/{frontendId}/deployments
GET /projects/{id}/frontends/{frontendId}/domains
POST /projects/{id}/frontends/{frontendId}/domains
DELETE /projects/{id}/frontends/{frontendId}/domains/{domain}
GET /projects/{id}/frontends/{frontendId}/domains/{domain}
PATCH /projects/{id}/frontends/{frontendId}/domains/{domain}
GET /projects/{id}/frontends/{frontendId}/frontend-routes
POST /projects/{id}/frontends/{frontendId}/frontend-routes
DELETE /projects/{id}/frontends/{frontendId}/frontend-routes/{routeId}
PUT /projects/{id}/frontends/{frontendId}/frontend-routes/{routeId}
GET /projects/{id}/frontends/{frontendId}/serving
POST /projects/{id}/frontends/{frontendId}/serving/rollback
GET /projects/{id}/functions/{functionId}/candidates
POST /projects/{id}/functions/{functionId}/candidates
DELETE /projects/{id}/functions/{functionId}/candidates/{candidateId}
GET /projects/{id}/functions/{functionId}/candidates/{candidateId}
GET /projects/{id}/functions/{functionId}/candidates/{candidateId}/deployments
POST /projects/{id}/functions/{functionId}/candidates/{candidateId}/deployments
POST /projects/{id}/functions/{functionId}/candidates/{candidateId}/promote
GET /projects/{id}/functions/{functionId}/serving
POST /projects/{id}/functions/{functionId}/serving/rollback
GET /projects/{id}/git-connection/owner-push
PUT /projects/{id}/git-connection/root-directory
GET /projects/{id}/git-deployment-runs
GET /projects/{id}/git-deployment-runs/{runId}
GET /projects/{id}/notifications
PUT /projects/{id}/notifications
POST /projects/{id}/notifications/test
POST /projects/{id}/notifications/webhook-secret
POST /realtime/v1/publish
POST /sandbox-file-archives
POST /sandbox-file-parts
GET /sandbox-session-files
GET /share-previews/{share_id}
GET /share-release-drafts
GET /share-releases
POST /share-releases
GET /share-stats
GET /shares
POST /shares
DELETE /shares/{share_id}
GET /shares/{share_id}
PATCH /shares/{share_id}
GET /slack/callback
DELETE /user/sessions
GET /user/sessions
DELETE /user/sessions/{sessionId}
GET /user/slack/channels
GET /user/slack/connections
POST /user/slack/connections
DELETE /user/slack/connections/{connectionId}
POST /user/slack/installations
DELETE /user/tokens/current

Deleted Endpoints: 3


GET /projects/{id}/autofix
PUT /projects/{id}/autofix
DELETE /projects/{id}/autofix/api-key

Modified Endpoints: 268


POST /auth/device/token

  • Responses changed
    • Modified response: 403
      • Description changed from 'access_denied - the approving account's email domain is not in
        allowed_email_domains while allowed_email_domains_mode is
        signup_and_signin. Re-checked here because approval and redemption
        are separate requests.
        ' to 'access_denied - the approving account's canonical email, or the email
        of any of its identities, is not in allowed_email_domains while allowed_email_domains_mode is
        signup_and_signin. Re-checked here because approval and redemption
        are separate requests.
        '

POST /auth/device/verify

  • Responses changed
    • Modified response: 401
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

POST /auth/forgot-password

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401
    • Modified response: 403
      • Description changed from 'Password reset is disabled for this project' to 'Password reset or email/password is turned off for this project'
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 429
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

POST /auth/logout

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /auth/oauth/exchange

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Missing or invalid project anon key' to 'Missing or invalid project anon key; or invalid auth proxy metadata'
    • Modified response: 403
      • Description changed from 'Email confirmation is now required, or the account's email domain is not
        in allowed_email_domains while allowed_email_domains_mode is
        signup_and_signin. Both are re-checked here because the code outlives
        the callback that issued it.
        ' to 'Email confirmation is now required, or the account's canonical email or
        the provider identity's email is not in allowed_email_domains while
        allowed_email_domains_mode is signup_and_signin. Both are re-checked here because the code outlives
        the callback that issued it.
        '

GET /auth/oauth/providers

  • Description changed from 'Get list of OAuth providers linked to current user' to 'Lists the OAuth providers linked to the signed-in user, with the
    user's own account ID at each provider. Match on provider_user_id,
    which never changes, rather than on the login or email. For
    GitHub, it is the numeric user ID that GitHub reports elsewhere, such
    as a webhook's sender.id.
    '
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: providers
                • Items changed
                  • Required changed
                    • New required property: linked_at
                    • New required property: provider
                    • New required property: provider_user_id
                    • New required property: updated_at
                  • Properties changed
                    • New property: provider_login
                    • New property: provider_user_id
    • Modified response: 401
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

POST /auth/oauth/{provider}/call-api

  • Responses changed
    • Modified response: 400
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 401
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 404
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 500
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 502
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

GET /auth/oauth/{provider}/callback

  • Responses changed
    • New response: 404
    • Modified response: 400
      • Description changed from 'Missing/invalid code or state, the state parameter expired, or the
        flow's stored redirect_url is no longer registered in
        allowed_redirect_urls (re-checked at callback time)
        ' to 'Missing/invalid code or state, the state parameter expired, the
        provider was disabled after the flow started, or the flow's stored
        redirect_url is no longer registered in allowed_redirect_urls (both
        re-checked at callback time)
        '
    • Modified response: 403
      • Description changed from 'The provider's email domain is not in allowed_email_domains. Creating
        an account is refused under signup and signup_and_signin; signing in
        an already-linked account is refused under signup_and_signin.
        ' to 'The provider's email domain is not in allowed_email_domains. Creating
        an account is refused under signup and signup_and_signin; signing in
        an already-linked account is refused under signup_and_signin, as it is
        when the account's canonical email is outside the list. A new account
        at a reserved domain (anonymous.volcano.internal, volcano.local) is
        refused whatever the project allows.
        '

POST /auth/oauth/{provider}/link

  • Responses changed
    • Modified response: 400
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 401
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 404
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 409
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

POST /auth/oauth/{provider}/refresh-token

  • Responses changed
    • Modified response: 400
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 401
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 404
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

GET /auth/oauth/{provider}/token

  • Responses changed
    • Modified response: 401
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 404
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

DELETE /auth/oauth/{provider}/unlink

  • Description changed from 'Remove OAuth provider from user's account.
    Cannot unlink if it's the only authentication method.
    ' to 'Remove OAuth provider from user's account. Refused when the account would
    have no other way to sign in: another linked OAuth provider that's enabled
    for the project, or a password while email/password sign-in is on for the
    project (enable_email_password).
    '
  • Responses changed
    • Modified response: 400
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 401
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 404
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

GET /auth/password-policy

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid, missing, or revoked anon key' to 'Invalid, missing, or revoked anon key; or invalid auth proxy metadata'
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 404
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

POST /auth/platform/exchange

  • Responses changed
    • Modified response: 403
      • Description changed from 'Exchange not allowed for this session/client/project, or the
        account's email domain is not in allowed_email_domains while
        allowed_email_domains_mode is signup_and_signin. The domain is
        re-checked here because the minted platform token outlives the
        session it is exchanged from.
        ' to 'Exchange not allowed for this session/client/project, or the
        account's canonical email, or the email of any of its identities, is
        not in allowed_email_domains while allowed_email_domains_mode is
        signup_and_signin. The domain is re-checked here because the minted platform token outlives the
        session it is exchanged from.
        '
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

POST /auth/refresh

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid or expired refresh token' to 'Invalid or expired refresh token; or invalid auth proxy metadata'
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 403
      • Description changed from 'The account's email domain is not in allowed_email_domains while
        allowed_email_domains_mode is signup_and_signin, so the session
        cannot be extended
        ' to 'The account's canonical email, or the email of the identity the
        session signed in with, is not in allowed_email_domains while
        allowed_email_domains_mode is signup_and_signin, so the session
        cannot be extended
        '
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'
    • Modified response: 429
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

POST /auth/resend-confirmation

  • Responses changed
    • Modified response: 429
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description changed from 'Stable machine-readable error code when a specific recovery path is available.' to 'Stable machine-readable error code when a specific recovery path is available. plan_required (403) means the project owner's plan does not include the requested feature or option; upgrading the plan unlocks it. person_required (403) means a project access token tried to change LavaFlow settings, which only the project's owner changes, with a platform token, or that the change needs the owner's own credential that expires, a project repository, and an owner whose GitHub account can push to it; error says which. A 403 without a code leaves the reason unspecified: it can be an access refusal, a reached limit, or a plan check that could not read the owner's plan. Match on the code, not the message text.'

POST /auth/reset-password

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 403
    • Modified response: 401
      • Description changed from 'Invalid or expired token' to 'Invalid or expired token; or invalid auth proxy metadata'
    • Modified response: 503
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: code
                • Description chan

Report truncated; see the source commit for the complete contract diff.

Validation

@kong
kong Bot force-pushed the chore/sync-openapi branch 6 times, most recently from c6391e8 to ea3d391 Compare September 5, 2026 02:49
@kong
kong Bot force-pushed the chore/sync-openapi branch 2 times, most recently from 1af2768 to 09b12fe Compare September 10, 2026 22:00
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@kong
kong Bot force-pushed the chore/sync-openapi branch 13 times, most recently from 574efbb to 3d26a9c Compare September 17, 2026 18:05
@kong
kong Bot force-pushed the chore/sync-openapi branch 8 times, most recently from 4f5a9fd to 3fada80 Compare September 19, 2026 06:17
@kong
kong Bot force-pushed the chore/sync-openapi branch 8 times, most recently from 8254557 to ba78d30 Compare October 7, 2026 19:00

@swkeever swkeever left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Update the pinned contract SHA alongside this sync. Both required Ruby suites fail the bundled-contract assertion in spec/volcano_generation_spec.rb: expected d8d8f53d847bfdc31c6a9aa5d583a8541f67be3a52b79cd754163660d001a9a8, actual 90f23da23d78af8e2be84044333b891f5f58ed29638146c620cd9cb67fde4d9c. The new snapshot matches Hosting 111313e148bad1bbd3537a509b357e6d1abdaa0c/api/openapi.bundled.yaml. Update the fixture after validating that contract and rerun bundle exec rake quality. This failure also prevents the later injected-defect and package smoke checks from running.

CI evidence: https://github.com/Kong/volcano-sdk-ruby/actions/runs/38667886847/job/116203898115

tkkhq
tkkhq previously approved these changes Oct 15, 2026

@tkkhq tkkhq left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The non-blocking checksum defect in the existing review remains: spec/volcano_generation_spec.rb:10,52 expects d8d8f53d847bfdc31c6a9aa5d583a8541f67be3a52b79cd754163660d001a9a8, while the vendored contract hashes to 90f23da23d78af8e2be84044333b891f5f58ed29638146c620cd9cb67fde4d9c. Update the expected digest and pass bundle exec rake quality before merge; the Ruby suites and Quality Gate still fail.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

AI review: 2 P0-P2 finding(s)

Reviewed 54d4c7a. Run log

An automated re-sync of the vendored OpenAPI contract from Kong/volcano-hosting@​77bcad0c49a2, which regenerates about 285 files of the private Volcano::Generated client (a 4.6 MB diff). It adds LavaFlow, shares, forks, connectors, Slack, notifications, account sessions, migrations, candidates, durable callbacks and sandbox file operations, and it removes Autofix. The APIs the SDK facade calls change mostly by addition: optional auth-proxy headers, an extra ProjectAccessToken auth name, and an idempotency-key pattern. Two earlier problems remain at this head. The spec suite still pins the old contract digest, so CI fails. The linked-OAuth-providers model now raises ArgumentError on entries without the new provider_user_id.

🟠 P1

  • openapi/openapi.yaml:26 Contract re-synced without updating the pinned SHA-256 in spec/volcano_generation_spec.rb (also reported as: Update the pinned contract digest alongside the sync)

🟡 P2

  • lib/volcano/generated/lib/volcano-generated/models/auth_list_o_auth_providers200_response_providers_inner.rb:93 Listing linked OAuth providers raises a bare ArgumentError when an entry lacks provider_user_id (also reported as: Preserve linked-provider responses without the new account ID)

⚪ P3

  • lib/volcano/generated/lib/volcano-generated/models/frontend_custom_domain_redirect_request.rb:104 New redirect models default status to the undefined constant STATUS::N308
  • lib/volcano/generated/lib/volcano-generated/models/durable_message_direction.rb:18 Generated enum constants renamed to verbose x-enum-varnames forms (also reported as: Direction constants acquire redundant generated names)

🟣 Pre-existing

  • README.md:1039,1041 README's Generated boundary section names a stale Hosting commit and contract digest (also reported as: Generated-boundary provenance was already stale)

Not checked: The AI review read the diff, the code, and the PR's text; it ran no tests or builds and read nothing outside this repository.

  • Whether bin/check-openapi with the pinned generator reproduces the committed generated tree byte for byte.
  • Whether deployed Hosting and local mode return provider_user_id, linked_at and updated_at for every existing linked OAuth identity.
  • The new LavaFlow, shares, forks, connectors, Slack, notifications, migrations, candidates and frontends code, which the facade does not call, was not read line by line.
  • Whether bin/check-openapi reproduces the committed generated tree with the pinned tooling.
  • Whether every supported Hosting deployment and local mode supplies provider_user_id for each linked OAuth identity.

Push a fix, or have a collaborator with write access (including the PR author) add the ai-review-override label to accept 54d4c7a as is. An override also needs a human review.

16 rounds in a row have found P0-P2 problems since this PR was last marked ready for review, so the AI review asks the author to re-assess the approach.

Human review: needed

  • Can the ~285 regenerated files under lib/volcano/generated/ and the openapi/openapi.yaml rewrite (a 4.6 MB diff) be approved when only the APIs and models the SDK facade calls were reviewed closely?
  • Is it acceptable to remove the Autofix operations, their models, and ProjectConfig.autofix from the shipped Volcano::Generated client and the vendored contract, given anyone who relies on them?
  • Have the remaining changes in the 286-file sync under openapi/openapi.yaml and lib/volcano/generated/ been reviewed closely enough to establish contract and client correctness?
  • Is removing the public Autofix endpoints and ProjectConfig.autofix from openapi/openapi.yaml acceptable for existing contract consumers?

Decide the points above: approve to accept them, or request changes.

Suggested reviewer: swkeever (most commits to openapi/openapi.yaml and the generated client). Any collaborator with write access other than the author can approve.

class DurableMessageDirection
IN = "in".freeze
OUT = "out".freeze
DurableMessageDirectionIn = "in".freeze

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚪ P3: Generated DurableMessageDirection::IN/OUT renamed to DurableMessageDirectionIn/DurableMessageDirectionOut

The upstream contract added Go-style x-enum-varnames, and the Ruby generator uses them as constant names. As a result, Volcano::Generated::DurableMessageDirection::IN and ::OUT disappear and are replaced by the repetitive DurableMessageDirection::DurableMessageDirectionIn and ::DurableMessageDirectionOut. The new autofix enums get the same style (e.g. AutofixRunStatus::AutofixRunStatusQueued). The handwritten facade compares plain 'in'/'out' strings (lib/volcano/durable_messages.rb, lib/volcano/durable_message_stream.rb), so nothing in this repo breaks. CONTRIBUTING.md and docs/versions.md also treat Volcano::Generated as internal. Still, the namespace ships in the gem, so any consumer that referenced the old constants gets NameError after upgrading, and the commit is typed chore so no breaking change is announced. If the old names matter, map them back with the generator's native enum-name mapping configuration in openapi-generator.yaml rather than editing generated code.

Found by claude-opus-5-5

if attributes.key?(:'status')
self.status = attributes[:'status']
else
self.status = STATUS::N308

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚪ P3: New redirect models default status to undefined constant STATUS::N308, raising NameError

FrontendCustomDomainRedirectRequest#initialize (and ProjectConfigCustomDomainRedirect#initialize at line 102 of project_config_custom_domain_redirect.rb) assign self.status = STATUS::N308 when status is omitted, but no STATUS constant is defined anywhere in the generated client. Building either model without status — e.g. FrontendCustomDomainRedirectRequest.new(to: 'www.example.com'), or deserializing a GET /projects/{id}/config response whose custom_domains[].redirect omits status — raises NameError: uninitialized constant ...::STATUS. Nothing in the facade reaches these models today (FrontendsApi/ProjectsApi are not in GeneratedApis, and Volcano::Generated is private), so this only bites once a facade wraps custom-domain redirects or project config. The same pattern already exists in CreateSandboxTemplateRequest (MEMORY_MB::N1024). The repo owns openapi/templates/partial_model_generic.mustache, which renders {{{defaultValue}}} verbatim; emitting the literal value for inline integer enums there would fix all three.

Found by claude-opus-5-5

if attributes.key?(:'status')
self.status = attributes[:'status']
else
self.status = STATUS::N308

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 P2: Generate a valid integer default for redirect status

Constructing FrontendCustomDomainRedirectRequest.new(to: 'www.example.com') raises NameError: STATUS::N308 is undefined, although the contract permits omitting status and promises a default of 308. ProjectConfigCustomDomainRedirect has the same defect at line 102, breaking deserialization of redirects that omit status. Fix default generation and regenerate both models so the default is the integer 308.

Found by gpt-6.1-sol

Comment thread openapi/openapi.yaml
@@ -35,6 +35,8 @@ tags:
a start returns is an execution to poll and stop, not a result. Durable
work is metered on its own allowances: executions, and the operations each
execution performs while it runs.
- name: Notifications

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 P1: Update the pinned contract digest with the sync

The changed contract hashes to f98942216d85196297a3c17292e5d0beb4e7a72900528835ed9f3593a702207a, but spec/volcano_generation_spec.rb:10 still pins the base digest. Its assertion at line 52 therefore fails deterministically in both CI Ruby jobs through rake quality. Update the expected digest alongside the contract.

Found by gpt-6.1-sol

if attributes.key?(:'status')
self.status = attributes[:'status']
else
self.status = STATUS::N308

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚪ P3: New redirect models default status to an undefined STATUS::N308 constant

ProjectConfigCustomDomainRedirect#initialize (line 102) and FrontendCustomDomainRedirectRequest#initialize (frontend_custom_domain_redirect_request.rb:104) set self.status = STATUS::N308 when status is omitted. Neither class defines STATUS, so this raises NameError.

The contract makes status optional with a default of 308. That means a GET /projects/{id}/config response, or a hand-built request, with a redirect but no status would crash in the generated client instead of defaulting.

The generator already does this for integer-enum defaults: the base has MEMORY_MB::N1024 in create_sandbox_template_request.rb. Nothing in the SDK reaches these models today, because Volcano::Generated is private and the contract says a redirect can't exist while a frontend holds one domain. Anyone who later wraps custom-domain redirects should either set status explicitly or fix the generator template or mapping.

Found by claude-opus-5-5

Comment thread openapi/openapi.yaml
@@ -35,6 +35,8 @@ tags:
a start returns is an execution to poll and stop, not a result. Durable
work is metered on its own allowances: executions, and the operations each
execution performs while it runs.
- name: Notifications

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 P1: Pinned openapi_sha256 in spec/volcano_generation_spec.rb not updated for the re-synced contract

spec/volcano_generation_spec.rb:10 still pins 7fec2090…def8, the base contract's digest. This PR rewrites openapi/openapi.yaml, so its SHA-256 no longer matches. The check expect(Digest::SHA256.file(...openapi.yaml).hexdigest).to eq(openapi_sha256) at line 52 therefore fails every time. That fails quality:spec, and with it rake quality on both CI Ruby jobs. Merging as-is would turn main red. Fix: update openapi_sha256 to the new file's digest in the same commit as the sync, and ideally have the sync automation do this too.

Found by claude-opus-5-5

class DurableMessageDirection
IN = "in".freeze
OUT = "out".freeze
DurableMessageDirectionIn = "in".freeze

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚪ P3: Preserve concise Ruby direction enum names

The new x-enum-varnames replace IN and OUT with repetitive names such as DurableMessageDirection::DurableMessageDirectionIn without changing wire values. The facade uses strings and Volcano::Generated is private, so this is a low-impact generation and naming concern. Consider retaining the shorter Ruby names through generator configuration.

Found by gpt-6.1-sol

if attributes.key?(:'provider_user_id')
self.provider_user_id = attributes[:'provider_user_id']
else
self.provider_user_id = nil

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 P2: Listing linked OAuth providers raises a bare ArgumentError when an entry lacks the new provider_user_id

The regenerated model now requires provider, provider_user_id, linked_at and updated_at. Its setters raise ArgumentError on nil (lines 150–186); base checked none of these.

auth_list_oauth_providers (lib/volcano/generated_transport_oauth.rb:36) passes no debug_return_type, so every entry goes through this model. GeneratedTransport#invoke rescues only Generated::ApiError, so the error escapes.

Effects:

  • An entry without provider_user_id crashes client.auth.list_linked_oauth_providers. It could come from an older or local server, or from rows linked before Hosting stored the ID. The facade never reads that field.
  • Malformed entries now raise ArgumentError, not the documented TypeError, 'Expected complete linked OAuth providers' (lib/volcano/auth_oauth.rb:63-86).

The specs miss this: spec/support/generated_api/fake_o_auth_api.rb:35-47 returns a fake model without provider_user_id, skipping the generated model.

Fix: rescue that ArgumentError on this path and map it to the existing TypeError, or request the raw body and parse the timestamps in the facade. Add a spec that deserializes through the real generated model.

Found by claude-opus-5-5

if attributes.key?(:'provider_user_id')
self.provider_user_id = attributes[:'provider_user_id']
else
self.provider_user_id = nil

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 P2: Preserve linked-provider responses without the new account ID

A response containing provider, linked_at, and updated_at, valid under the previous contract, now raises ArgumentError when provider_user_id is absent. GeneratedTransport#auth_list_oauth_providers uses this model, and invoke does not rescue that exception, so client.auth.list_linked_oauth_providers fails before the facade validates the response. Keep unused new metadata optional in the consumer boundary and preserve the facade’s existing error handling.

Found by gpt-6.1-sol

Comment thread openapi/openapi.yaml
@@ -23,8 +23,8 @@ tags:
description: Project-scoped log search and activity APIs
- name: Issues
description: 'Preview, not generally available: runtime errors grouped into issues. Where issues are not available, every endpoint answers `404` with code `feature_unavailable`.'
- name: Autofix
description: 'Preview, not generally available: AI diagnosis of a project''s issues and draft pull requests that fix them. Where autofix is not available, turning it on, or any request for a project that never saved settings, answers `404` with code `feature_unavailable`. Autofix is not available in local mode.'
- name: LavaFlow

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 P1: Update the pinned contract digest alongside the sync

The head contract hashes to ea8d99dbea0dd8ca7edcb794a0c3332a6981e67d31dae52f9ba14cce2260864c, but spec/volcano_generation_spec.rb:10 still expects the base digest, 168cf780…1bf340. Its assertion at line 52 therefore fails deterministically, failing quality:spec and both CI Ruby jobs. Update the expected digest with this sync.

Found by gpt-6.1-sol

Comment thread openapi/openapi.yaml
@@ -23,8 +23,8 @@ tags:
description: Project-scoped log search and activity APIs
- name: Issues
description: 'Preview, not generally available: runtime errors grouped into issues. Where issues are not available, every endpoint answers `404` with code `feature_unavailable`.'
- name: Autofix
description: 'Preview, not generally available: AI diagnosis of a project''s issues and draft pull requests that fix them. Where autofix is not available, turning it on, or any request for a project that never saved settings, answers `404` with code `feature_unavailable`. Autofix is not available in local mode.'
- name: LavaFlow

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 P1: Contract re-synced without updating the pinned SHA-256 in spec/volcano_generation_spec.rb

spec/volcano_generation_spec.rb:10 still pins 168cf780648fdb7878275bd8e596091341a90bed137e7871e546fbf11b1bf340, and this PR does not touch that file. It does rewrite openapi/openapi.yaml, so the file's digest changes. The digest assertion at line 52 therefore fails every time. That fails quality:spec and rake quality in CI, and merging as-is turns main red. Fix: update openapi_sha256 to the new file's digest in the same commit as the sync. Ideally the sync automation would also rewrite the pin.

Found by claude-opus-5-5

if attributes.key?(:'status')
self.status = attributes[:'status']
else
self.status = STATUS::N308

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚪ P3: Generate a defined default for redirect status

Constructing FrontendCustomDomainRedirectRequest.new(to: 'www.example.com') raises NameError because STATUS::N308 is undefined, although the schema permits omitted status and defaults it to 308. ProjectConfigCustomDomainRedirect:102 has the same defect. These APIs are currently outside the public facade, limiting the impact to the internal generated client. Correct default generation to emit integer 308 and regenerate both models.

Found by gpt-6.1-sol

@github-actions

Copy link
Copy Markdown

AI review: re-assess the approach

PR author, the AI review has found P0-P2 problems in 3 rounds in a row, through 713b74d, since this PR was last marked ready for review. When each fix brings new findings, the approach is usually the problem rather than the next fix, but the AI review could not move this PR back to draft, so it keeps reviewing each push. Convert the PR to draft yourself while you decide how to go on.

Consider:

  • Split it into smaller PRs that each review cleanly.
  • Simplify the design, so there is less that can go wrong.
  • Rethink the approach where the findings keep landing in the same place.
  • Push back on findings you think are wrong: reply on each with a reason, or the follow-up work it waits for, and the next round reads it.

Coding agents: stop here and do not push another fix for these findings. Tell the author this PR did not converge after 3 AI review rounds, summarize the open findings and where they cluster, recommend one of the options above, and wait for the author's decision before changing the code or marking the PR ready for review.

Marking the PR ready for review starts a new set of 3 rounds with a review of the current head. To accept the findings as they stand, mark it ready, and once that review finishes, add the ai-review-override label.

@github-actions

Copy link
Copy Markdown

AI review: re-assess the approach

PR author, the AI review has found P0-P2 problems in 16 rounds in a row, through 54d4c7a, since this PR was last marked ready for review. When each fix brings new findings, the approach is usually the problem rather than the next fix, so the AI review moved this PR back to draft, where it reviews no pushes, until you decide how to go on.

Consider:

  • Split it into smaller PRs that each review cleanly.
  • Simplify the design, so there is less that can go wrong.
  • Rethink the approach where the findings keep landing in the same place.
  • Push back on findings you think are wrong: reply on each with a reason, or the follow-up work it waits for, and the next round reads it.

Coding agents: stop here and do not push another fix for these findings. Tell the author this PR did not converge after 16 AI review rounds, summarize the open findings and where they cluster, recommend one of the options above, and wait for the author's decision before changing the code or marking the PR ready for review.

Marking the PR ready for review starts a new set of 3 rounds with a review of the current head. To accept the findings as they stand, mark it ready, and once that review finishes, add the ai-review-override label.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants