Skip to content

fix(source-zendesk-support): skip refused tickets on side_conversations instead of failing the sync - #84353

Open
Anatolii Yatsuk (tolik0) wants to merge 3 commits into
masterfrom
tolik0/source-zendesk-support/side-conversations-403-skip
Open

fix(source-zendesk-support): skip refused tickets on side_conversations instead of failing the sync#84353
Anatolii Yatsuk (tolik0) wants to merge 3 commits into
masterfrom
tolik0/source-zendesk-support/side-conversations-403-skip

Conversation

@tolik0

@tolik0 Anatolii Yatsuk (tolik0) commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

What

Resolves https://github.com/airbytehq/oncall/issues/13285.

A sync fails outright, every run, when Zendesk refuses side conversations for a single parent ticket:

'GET' request to '.../api/v2/tickets/<id>/side_conversations?per_page=100' failed with status
code '403' and error message: ''. Request (body): 'None'. Response (body): ''.

followed by the sync-killing:

Unable to read data for stream 'side_conversations'. The endpoint returned an error indicating a
configuration issue. Please ensure that your account has the necessary access level and that the
endpoint is available. Error message: None

Access to side conversations is granted per ticket, not per stream. The feature requires the Collaboration add-on, access can be restricted per brand and per group, and the tickets incremental export also returns deleted tickets. So Zendesk refuses individual tickets while the rest of the stream reads normally — a refusal must skip that ticket, not fail the sync.

The stream's error handler tried to tolerate exactly this, but keyed on the response body:

- http_codes: [422]                                  # IGNORE
- error_message_contains: "You do not have access"   # IGNORE  <- never matches
- http_codes: [403, 404]                             # FAIL / config_error

Denials from Zendesk's collaboration-api arrive as a 403 with an empty text/html body. HttpResponseFilter._response_contains_error_message parses the body with JsonErrorMessageParser, which yields nothing for a non-JSON body, so the IGNORE filter cannot match and the request falls through to the FAIL filter below it. The same emptiness is why the user-facing message ends in Error message: None{{ response.get('error') }} interpolates against _safe_response_json, which returns {}.

Why this surfaced in 5.5.0 and not earlier

side_conversations was added in 5.3.0, while tickets was reading the Export Search Results endpoint. That endpoint is served from Zendesk's search index, which excludes deleted tickets — so those tickets never became substream partitions. #81640 reverted tickets to the Incremental Ticket Export endpoint, which returns them. side_conversations has therefore never run against this parent in any released version; the pairing is new as of 5.5.0, not restored.

Why it cannot self-heal

side_conversations is a substream with incremental_dependency: true, so the parent cursor is only checkpointed once the substream finishes. Because it never finishes, parent_state never advances — an affected connection restarts the same parent walk and dies on the same ticket every run, indefinitely, re-walking months of parent tickets each time (which is also where the rate-limit pressure on these jobs comes from). Observed on a live connection: side_conversations.parent_state frozen at the state-migration floor while ticket_metrics.parent_state on the same connection and same parent had advanced to the current day.

How

Replaced the body-keyed IGNORE and the [403, 404] FAIL pair with status-code-keyed IGNOREs:

- http_codes: [422]   # unchanged — ticket type does not support side conversations
- http_codes: [403]   # IGNORE — plan/add-on/brand/group restriction on this ticket
- http_codes: [404]   # IGNORE — ticket no longer exists

This is not a new pattern for this connector. The stateful ticket_metrics path requests the same class of per-ticket endpoint (GET /tickets/{ticket_id}/metrics) and has used status-code-keyed 403/404 IGNOREs since before 5.2.0 — its 404 message even reads "Not found. Ticket was deleted." That stream stays healthy on connections where side_conversations deadlocks, which makes it the control case for this change.

Both new messages state the condition and the likely cause without the misleading remediation prose, and neither interpolates a value that cannot resolve. Note the error-message context here is limited to config, response, headers and $parametersstream_partition is not available, so the messages deliberately do not attempt to name the ticket.

Relationship to #83708

That open draft makes the shared requester handler stricter (403/404 → FAIL, no body-substring IGNORE) so stream-level permission denials stop producing silent zero-record successes. This PR moves side_conversations in the opposite direction, and both are correct: the shared handler serves stream-level endpoints where a denial means no data at all, while side_conversations is per-partition where a denial means one ticket. The two changes touch adjacent lines and will need a trivial conflict resolution; they should not be reconciled into a single policy.

Declarative-First Evaluation

Declarative only. No Python component was added or modified — DefaultErrorHandler and HttpResponseFilter already express the needed behavior, and the defect was which condition the filters keyed on.

Breaking Change Evaluation

Not breaking. No change to schema, spec, primary key, cursor, stream set, or state format; no migration needed.

It does change an outcome: syncs that failed with a config_error will now succeed, with the refused tickets' side conversations absent and one INFO log per skipped ticket. Stated plainly, the trade-off is that a complete loss of side-conversations access would now read as an empty stream rather than a failure. That is accepted here because the refusal is partition-scoped and indistinguishable, at the HTTP layer, from the per-ticket case — the same trade ticket_metrics has always made. Version 5.5.2.

Test Coverage

unit_tests/mock_server/test_side_conversations.py:

  • test_given_403_with_empty_html_body_when_read_then_ignore_and_continue — the real failure shape; fails on master, passes here.
  • test_given_404_when_read_then_ignore_and_continue — deleted ticket; fails on master.
  • test_given_one_ticket_denied_when_read_then_other_tickets_still_sync — two parent tickets, one refused with an empty-body 403, asserts the readable one still yields its record and no errors are emitted; fails on master.
  • test_given_403_when_read_then_ignore_and_continue — 403 carrying Zendesk's JSON error envelope. Passes on master too (the old body filter did catch this variant), kept to lock in that both body shapes are handled.

Added ErrorResponseBuilder.with_empty_html_body() so the empty non-JSON body can be reproduced at all; every existing builder emitted a JSON envelope, which is precisely why this path had no coverage.

poetry run pytest -q mock_server/test_side_conversations.py
9 passed

Full connector suite: 217 passed, 2 failed. Both failures are in mock_server/test_tickets.py on the tickets_search stream (test_given_lookback_window_..., test_when_read_tickets_search_then_partitions_produce_correct_query_params) and reproduce identically on unmodified master — pre-existing, unrelated to this change.

Review guide

  1. manifest.yaml — the three filters, and whether 404 → IGNORE is the right call for a deleted parent ticket.
  2. Whether the accepted trade-off above (total loss of access reads as empty, not failed) is acceptable, given ticket_metrics already makes it.
  3. AGENTS.md §5 — documents the body-vs-status trap and the parent_state deadlock for whoever adds the next per-parent substream.

Follow-up not in this PR

Seven other substreams request one URL per parent record and inherit the shared handler with no override, so a single refused or deleted parent record fails those syncs the same way: article_attachments, article_comments, article_votes, article_comment_votes, post_comments, post_votes, post_comment_votes. #83708 making the shared handler stricter will make that latent failure more likely, not less. Worth a dedicated PR rather than widening this one.

Also noted: the stateful ticket_metrics 403 message contains a literal {self.name}, which is not interpolated by the declarative framework and renders verbatim. Left alone here to avoid conflicting with #83708, which already touches that line.

Can this PR be safely reverted and rolled back?

  • YES 💚
  • NO ❌

Important

Active progressive rollout warning for source-zendesk-support.

  • (Click to Approve:) Bypass the active progressive rollout warning for source-zendesk-support in the PR comment here.

…ns instead of failing the sync

Access to side conversations is granted per ticket, not per stream: the feature
requires the Collaboration add-on and can be restricted per brand and per group,
and the tickets incremental export also returns deleted tickets. Zendesk
therefore refuses individual tickets while the rest of the stream reads fine.

The stream's error handler tried to tolerate that with an
`error_message_contains: "You do not have access"` IGNORE filter, but the
collaboration-api service answers these denials with a 403 carrying an empty
`text/html` body. `HttpResponseFilter._response_contains_error_message` parses
the body as JSON, so the filter never matched and the request fell through to
the `[403, 404] -> FAIL / config_error` filter below it, killing the whole sync
on the first refused ticket.

Replace both filters with status-code-keyed IGNOREs for 403 and 404, matching the
pattern the stateful `ticket_metrics` path has used on the same class of
per-ticket endpoint since before 5.2.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@octavia-bot
octavia-bot Bot marked this pull request as draft August 13, 2026 14:59
@octavia-bot

octavia-bot Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Note

📝 PR Converted to Draft

More info...

Thank you for creating this PR. As a policy to protect our engineers' time, Airbyte requires all PRs to be created first in draft status. Your PR has been automatically converted to draft status in respect for this policy.

As soon as your PR is ready for formal review, you can proceed to convert the PR to "ready for review" status by clicking the "Ready for review" button at the bottom of the PR page.

To skip draft status in future PRs, please include [ready] in your PR title or add the skip-draft-status label when creating your PR.

@github-actions

Copy link
Copy Markdown
Contributor

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

PR Slash Commands

Airbyte Maintainers (that's you!) can execute the following slash commands on your PR:

  • 🛠️ Quick Fixes
    • /format-fix - Fixes most formatting issues.
    • /bump-version - Bumps connector versions, scraping changelog description from the PR title.
      • Bump types: patch (default), minor, major, major_rc, rc, promote.
      • The rc type is a smart default: applies minor_rc if stable, or bumps the RC number if already RC.
      • The promote type strips the RC suffix to finalize a release.
      • Example: /bump-version type=rc or /bump-version type=minor
    • /bump-progressive-rollout-version - Alias for /bump-version type=rc. Bumps with an RC suffix and enables progressive rollout.
  • ❇️ AI Testing and Review (internal link: AI-SDLC Docs):
    • /ai-prove-fix - Runs prerelease readiness checks, including testing against customer connections.
    • /ai-canary-prerelease - Rolls out prerelease to 5-10 connections for canary testing.
    • /ai-review - AI-powered PR review for connector safety and quality gates.
  • 📝 AI Documentation:
    • /ai-docs-review - AI-powered documentation review for PRs with connector changes.
    • /ai-create-docs-pr - Creates a documentation PR for connector changes, stacked on the current PR.
  • 🚀 Connector Releases:
    • /publish-connectors-prerelease - Publishes pre-release connector builds (tagged as {version}-preview.{git-sha}) for all modified connectors in the PR.
    • /enable-autopilot-rollouts - Enables autopilot progressive rollouts for the modified connector(s) in the PR, remediating "autopilot rollouts not enabled for {connector-name}" auto-merge blockers. Sets defaultRolloutMode: autopilot and enableProgressiveRollout: true, preserving any existing autopilotConfig.
      • Optional args: connector=<CONNECTOR_NAME> (defaults to the modified connectors in the PR), strategy=fast|slow|default (defaults to fast).
      • Example: /enable-autopilot-rollouts or /enable-autopilot-rollouts connector=source-faker strategy=slow
  • ☕️ JVM connectors:
    • /update-connector-cdk-version connector=<CONNECTOR_NAME> - Updates the specified connector to the latest CDK version.
      Example: /update-connector-cdk-version connector=destination-bigquery
  • 🐍 Python connectors:
    • /poe connector source-example lock - Run the Poe lock task on the source-example connector, committing the results back to the branch.
    • /poe source example lock - Alias for /poe connector source-example lock.
    • /poe source example use-cdk-branch my/branch - Pin the source-example CDK reference to the branch name specified.
    • /poe source example use-cdk-latest - Update the source-example CDK dependency to the latest available version.
  • ⚙️ Admin commands:
    • /force-merge reason="<REASON>" - Force merges the PR using admin privileges, bypassing CI checks. Requires a reason.
      Example: /force-merge reason="CI is flaky, tests pass locally"
📚 Show Repo Guidance

Helpful Resources

📝 Edit this welcome message.

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Detected source-zendesk-support Active Rollout: true

Important

Active progressive rollout warning for source-zendesk-support.

To bypass this warning, click on the matching checkbox in the PR description. Look for the checkbox text:

(Click to Approve:) Bypass the active progressive rollout warning for source-zendesk-support in the PR comment

  • Rollout version: 5.5.1
  • Rollout state: workflow_started
  • Rollout last updated by: Airbyte Support Bot <airbyte-support-bot@airbyte.io>
  • Open Connector Rollout Manager in Retool to clean up or close out this rollout if appropriate.

Version on master Branch: 5.5.1

  • RC marker on master branch: false

PR Description Checkbox Status

  • Bypass checkbox checked: false

ℹ️ More Information

Show/hide details...

🤔 What happens if this PR is merged

Checking the checkbox will allow the PR to merge, but it does not necessarily stop the active rollout by itself. The result of the PR merging depends on what connector version is published.

Expected outcomes by type of version number change:

If connector version is not modified in this PR...

No new connector version should be released, and the active rollout should continue unchanged.

If the connector version increments to a higher `-rc` version...

After this PR is merged, the new RC will be published and registered, replacing the active RC marker. When the new RC is registered, the platform cancels any existing non-terminal rollout for this connector without unpinning actors.

After merging, you still need to start the new rollout. During start, pinned actors from the previous rollout can be moved to the new RC.

If the connector version changes from RC to non-RC (GA) version...

You should not merge the PR unless/until the RC has been finalized as canceled. See above Rollout state for detected status.

[!Warning]
This PR should not be merged if the RC rollout is still active. First finalize the active rollout as successful or cancel it in Connector Rollout Manager.

When you finalize an RC rollout as successful, the platform triggers a promotion workflow that strips the -rc suffix, removes stable-version registryOverrides, disables progressive rollout, force-merges that promotion, and unpins actors.

🔁 How to rerun this check

To rerun the check, simply check and uncheck the box, or else modify the PR description and/or title in any way.

Alternatively, you can find the Active Progressive Rollout CI workflow and manually rerun it (although this is generally slower than the above methods).


This comment will be updated as PR and/or rollout status changes.

Workflow run

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Deploy preview for airbyte-docs ready!

Project:airbyte-docs
Status: ✅  Deploy successful!
Preview URL:https://airbyte-docs-k1biji43i-airbyte-growth.vercel.app
Latest Commit:32a0478

Deployed with vercel-action

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@tolik0
Anatolii Yatsuk (tolik0) marked this pull request as ready for review August 13, 2026 15:14
@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

source-zendesk-support Connector Test Results

239 tests   233 ✅  8m 14s ⏱️
  2 suites    4 💤
  2 files      2 ❌

For more details on these failures, see this check.

Results for commit 32a0478.

♻️ This comment has been updated with latest results.

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Regression test results — fix verified

Comparison run (PR build vs published 5.5.1), warm read, all 41 streams:
https://github.com/airbytehq/airbyte-ops-mcp/actions/runs/31715320547

Command Verdict
SPEC ✅ both succeeded
CHECK ✅ both SUCCEEDED
DISCOVER ✅ both succeeded, side_conversations present in both catalogs
READ Target ✅ / Control ❌ (harness marks the comparison failed — nothing to diff)

The red workflow status is purely because the control (published 5.5.1) fails, which is exactly the bug this PR fixes.

Control (5.5.1) — dies on the first refused parent ticket:

'GET' .../api/v2/tickets/12004/side_conversations?per_page=100' failed with status code '403' and error message: ''
Exception while syncing stream side_conversations
Unable to read data for stream 'side_conversations'. The endpoint returned an error indicating a configuration issue...
During the sync, the following streams did not sync successfully: side_conversations

74 distinct parent tickets returned 403 with an empty body, so the error_message_contains: "You do not have access" filter never matched and the request escalated to config_error.

Target (this PR) — skips those tickets and completes:

Skipping side conversations for this ticket because Zendesk denied access to it. Side conversations require the
Collaboration add-on, and access can also be restricted per brand or group. Other tickets will continue to sync normally.
Finished syncing side_conversations

That message appears 74 times (one per refused ticket), the stream finishes, and the sync exits cleanly (exit code 0).

Other streams: only +1 record each on ticket_audits, ticket_comments, ticket_events (834 → 837 total), i.e. normal incremental drift between the two sequential reads. No schema or catalog differences.

Note on the connection used: the affected customer connection (EU data residency) cannot be regression-tested — credential retrieval is blocked for EU connections, so that run aborted at SPEC (https://github.com/airbytehq/airbyte-ops-mcp/actions/runs/31714876562). The run above uses another Tier-2 connection with side_conversations enabled which reproduces the identical 403-with-empty-body condition.

The 404 and 422 branches were not exercised — no such responses occurred on this connection.

@tolik0

Anatolii Yatsuk (tolik0) commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

/publish-connectors-prerelease

Pre-release Connector Publish Started

Publishing pre-release build for connector source-zendesk-support.
PR: #84353

Pre-release versions will be tagged as {version}-preview.32a0478
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish: SUCCESS

Docker image (pre-release):
airbyte/source-zendesk-support:5.5.2-preview.32a0478

Docker Hub: https://hub.docker.com/layers/airbyte/source-zendesk-support/5.5.2-preview.32a0478

Registry JSON:

@airbyte-support-bot

Copy link
Copy Markdown
Contributor

↪️ Triggering /ai-review per Hands-Free AI Triage Project triage next step.

Reason: PR is ready for review, regression results against published 5.5.1 are posted, and no AI review has run on this branch yet.

Devin session

@octavia-bot

octavia-bot Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

AI PR Review starting...

Reviewing PR for connector safety and quality.
View playbook

Devin AI session created successfully!

@airbyte-support-bot

Airbyte Support Bot (airbyte-support-bot) commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

🛡️ AI PR Review Report

💬 Review Action: Comment (no approval)

🟡 Risk Level: 2 / 5 (Low-Moderate)

Small, well-tested manifest-only error-handling change on a single substream, backed by a live target-vs-control regression run. Not approved only because CI is not green: the two failing connector tests are config_oauth standard tests failing with 401 Unauthorized, which reproduce identically on an unrelated source-zendesk-support PR — pointing to expired/invalid shared OAuth test credentials rather than this diff. That cannot be verified as green from this PR, so the CI gate is UNKNOWN.

Gate Status Summary
Code Hygiene ⚠️ WARN Very long explanatory comment block above response_filters largely duplicates the new AGENTS.md section.
Forwards Compatibility ⚠️ WARN Ignoring 403/404 silently means an account-wide access problem (e.g. missing Collaboration add-on) now yields an empty stream instead of a config_error.
Behavioral Changes ⚠️ WARN Intentional: side_conversations no longer fails the sync on refused tickets; refused tickets are skipped and produce no records. Documented in the changelog.
CI Checks ❓ UNKNOWN Test source-zendesk-support Connector fails on 2 config_oauth standard tests with 401 Unauthorized; the same 2 failures also occur on unrelated PR #84354 — evidence for a maintainer to judge, not a verdict that they are preexisting.
📋 PR Details
🔍 Gate Evaluation Details

1. PR Hygiene — ✅ PASS
Conventional title, scoped to one connector, links the on-call issue, describes root cause and fix, bumps dockerImageTag to 5.5.2, and adds the matching changelog row in docs/integrations/sources/zendesk-support.md.
Note: the PR description states the CI failures are two tests in mock_server/test_tickets.py that reproduce on unmodified master. The actual failures on this HEAD are test_docker_image_build_and_check['config_oauth'] and test_basic_read['config_oauth'] in .tmp/integration_tests/test_airbyte_standards.py, failing with 401 Unauthorized on stream tags. Worth correcting so reviewers are not looking at the wrong signal.

2. Code Hygiene — ⚠️ WARN
Change is idiomatic declarative YAML using the CDK's built-in HttpResponseFilter, no custom Python components, error messages are actionable and explain both cause and consequence. The one concern is the multi-paragraph comment above response_filters: it restates content now captured in AGENTS.md section 5, and that duplication will drift. A 2–3 line comment pointing to the AGENTS.md section would age better.

3. Test Coverage — ✅ PASS
New mock-server tests cover the exact reported shape and the continuation guarantee: test_given_403_with_empty_html_body_when_read_then_ignore_and_continue, test_given_403_when_read_then_ignore_and_continue, test_given_404_when_read_then_ignore_and_continue, test_given_one_ticket_denied_when_read_then_other_tickets_still_sync. ErrorResponseBuilder.with_empty_html_body() reproduces the empty non-JSON body that defeated the old substring filter — i.e. the test would have caught the original bug. Targeted run reported 9 passed.

4. Code Security — ✅ PASS
No auth, credential, or secret handling touched. New error messages contain no tokens, subdomains, or PII; no logging of request/response bodies is added.

5. Per-Record Performance — ✅ PASS
No change to request volume or per-record work: side_conversations already issued one request per parent ticket, and refused tickets now short-circuit to ignore instead of raising. If anything this removes retry/backoff and failed-sync re-read cost.

6. Breaking Dependencies — ✅ PASS
No dependency, CDK version, or base-image change; manifest.yaml + tests only. No shared/common files touched, so no other connector is affected.

7. Backwards Compatibility — ✅ PASS
No spec, schema, stream name, primary key, cursor, or state format change. Patch bump is correct; no breaking-change entry needed in metadata.yaml. Existing connections keep working and previously failing syncs now complete.

8. Forwards Compatibility — ⚠️ WARN (non-blocking)
403 is now ignored unconditionally per ticket. That is right for the per-ticket/per-brand/per-group denial case, but it also silences the account-wide case: a workspace without the Collaboration add-on will now produce a permanently empty side_conversations stream with no config_error, which users can mistake for "no data". Ignoring 404 likewise would mask a future endpoint/path change. Consider a follow-up that surfaces a per-sync count of skipped tickets (or a single stream-level warning when every ticket is refused) so silent emptiness is distinguishable from genuine emptiness.

9. Behavioral Changes — ⚠️ WARN (intended and documented)
Before: any 403/404 on a ticket's side conversations failed the stream as config_error, and because side_conversations uses incremental_dependency: true the parent ticket cursor did not advance, so the same ticket kept failing every sync. After: the ticket is skipped, other tickets continue, the sync completes, and parent state advances. Trade-off accepted deliberately: refused tickets contribute no records, so the stream is now "best effort" for tickets the credentials cannot see. The changelog entry states this.

10. Out-of-Scope Changes — ✅ PASS
Every changed path belongs to source-zendesk-support or its docs page. The AGENTS.md addition is connector-local contributor guidance and is in scope.

11. CI Checks — ❓ UNKNOWN
Failing: Test source-zendesk-support Connector, source-zendesk-support Connector Test Results, Connector CI Checks Summary (aggregate). Progressive-rollout checks are excluded per policy.
Failure detail from the job log: AssertionError: 'check' for connector 'source-zendesk-support' did not succeed: status=FAILED, message="'Stream tags is not available: HTTP Status Code: 401. Error: Unauthorized.'" for test_docker_image_build_and_check['config_oauth'], plus the corresponding test_basic_read['config_oauth'].
Evidence it is not caused by this diff: check-run annotations on PR #84354 (fix(source-zendesk-support): render epoch cursor boundaries in UTC, HEAD e903807, an unrelated change that does not touch error handling) show the same two config_oauth test failures. That suggests the shared OAuth test credential is returning 401 rather than anything in this change, but this review is not asserting the failures are preexisting — a maintainer should confirm. Because the credential state cannot be repaired from the PR and CI is therefore not green, this gate stays UNKNOWN rather than PASS or FAIL.
Passing: Pre-Release Checks, Lint, Build and Verify Artifacts, Check Changelog Updated, Format Check, Analyze (python), Docs / Vale, Docs / MarkDownLint.

12. Live / E2E Tests — ✅ PASS
Live regression run against a real Zendesk account (target build vs published 5.5.1 control) is posted on the PR: SPEC/CHECK/DISCOVER succeeded for both; READ succeeded on the target while the 5.5.1 control failed on the empty-body 403; 74 refused tickets were skipped and the target sync exited cleanly. That is a direct control-reproduces / target-fixes demonstration of the reported failure. The harness's overall badge is red only because the control leg failed as expected. Caveat: the 404 and 422 paths were not exercised live and rest on the mock-server tests.

📚 Evidence Consulted
  • PR metadata, description, file list, reviews and comments (git_view_pr) at HEAD 32a0478
  • Full diff of all 6 changed files in the local checkout of branch tolik0/source-zendesk-support/side-conversations-403-skip
  • Check-run status for 32a0478 and failed-job logs for job 94495377758 (Test source-zendesk-support Connector)
  • Check-run annotations for source-zendesk-support Connector Test Results on PR fix(source-zendesk-support): render epoch cursor boundaries in UTC, not the host timezone #84354 HEAD e903807 (comparison for the config_oauth failures)
  • Live regression-test result comment posted on this PR (target vs published 5.5.1 control)
  • airbyte-integrations/connectors/source-zendesk-support/AGENTS.md (existing and added guidance)
  • Airbyte skills: breaking-change-evaluation, connectors-update-unique-behavior, judicious-code-comments, writing-good-error-messages, connector-regression-tests
🛠️ How to Respond

The only non-PASS enforced gate is CI Checks (UNKNOWN) — no changes to this diff are required for it.

  1. If the config_oauth 401 is indeed an expired/rotated shared credential, get the connector's OAuth test credentials refreshed in GSM and re-run Test source-zendesk-support Connector; the gate should then flip to PASS.
  2. If instead the 401 is expected for that scenario for another reason, say so on the PR and re-request review so the gate can be resolved with that evidence.
  3. Please also correct the CI paragraph in the PR description (it points at mock_server/test_tickets.py, not the actual config_oauth standard-test failures).
  4. Heads-up, unrelated to the gates: PR fix(source-zendesk-support): skip inaccessible side conversation tickets #84404 (fix(source-zendesk-support): skip inaccessible side conversation tickets) is open against the same connector and appears to address the same behavior — worth de-duplicating before either lands.

Re-request review with /ai-review after pushing changes or refreshing credentials.

Review generated by Devin · gates: 8 PASS / 3 WARN / 1 UNKNOWN / 0 FAIL

@airbyte-support-bot

Copy link
Copy Markdown
Contributor

🙋 Escalated per Hands-Free AI Triage Project — the AI review at 32a0478e passes every gate except CI Checks, which is UNKNOWN because test_docker_image_build_and_check[config_oauth] and test_basic_read[config_oauth] fail with 401 Unauthorized on stream tags. The same two failures appear on unrelated PR #84354, which points at the shared OAuth test credential rather than this diff — but that cannot be repaired from the PR, so no further automated stage can clear the gate. A maintainer is needed to refresh the source-zendesk-support OAuth test credentials in GSM and re-run the connector tests, and to de-duplicate against #84404, which changes the same behavior.


Devin session

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants