Skip to content

feat(source-ashby): add application_history stream - #84392

Draft
devin-ai-integration[bot] wants to merge 4 commits into
masterfrom
feat/source-ashby-application-history
Draft

feat(source-ashby): add application_history stream#84392
devin-ai-integration[bot] wants to merge 4 commits into
masterfrom
feat/source-ashby-application-history

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

What

Adds a new application_history stream to source-ashby, exposing interview stage entry/exit timestamps (enteredStageAt / leftStageAt) so customers can measure funnel velocity per stage. These timestamps exist nowhere else in the Ashby API — only on POST /application.listHistory — so no combination of existing streams can produce them.

Requested via airbytehq/oncall#13283. The reporting customer needs it for all historic applications, including archived and hired ones (funnel drop-off analysis), so the parent is deliberately unfiltered by status.

How

application_history is a full-refresh substream of applications, following the application_criteria_evaluations pattern already in this manifest: a SubstreamPartitionRouter over an inline applications_for_history parent, parent_key: id, partition_field: application_id, and AddFields re-attaching application_id to each child record.

Three things differ from that prior art, deliberately:

  • It paginates. application.listHistory returns paged results, so it gets a DefaultPaginator with CursorPagination injecting cursor into the request body, rather than NoPagination.
  • It declares primary_key: [id], so a full-refresh-overwrite or dedup destination keys history events correctly instead of appending duplicates on every sync.
  • The parent's status and createdAt ride along via extra_fields on the ParentStreamConfig, surfaced as application_status and application_created_at. Funnel analysis needs both, and carrying them here saves the user a join against applications — which matters because this stream is intended to run on its own connection, separately from applications.

Incremental sync is not offered, and that is a limitation of the endpoint rather than a shortcut. ApplicationListHistoryRequest is additionalProperties: false with only applicationId, cursor, and limit — there is no date filter and no syncToken. Ashby's syncToken mechanism, where it does exist, is an opaque value returned in the response envelope that must be persisted and replayed in the next sync's request body, and that is not expressible in a declarative manifest on CDK 7.17.4: incremental_sync accepts only DatetimeBasedCursor and IncrementingCountCursor, CustomIncrementalSync was removed from the declarative schema in CDK v7.0.0, and get_request_body_json accepts stream_state and discards it. This connector stays manifest-only, so full refresh is the correct shape.

Errors are differentiated per application rather than uniformly. Ashby returns what would be 4XX as HTTP 200 with success: false, so without an error handler a permission failure or an API-side rejection is indistinguishable from an account with no interview history: the stream completes, emits nothing, and exits 0. The child requester therefore gets a DefaultErrorHandler whose ordered HttpResponseFilters split soft failures by documented error code:

  • errorInfo.code == 'application_not_found'IGNORE. This is the one per-application condition Ashby documents (deleted or inaccessible application). With one partition per application, a single bad application must not abort a fan-out measured in hours, so that application's history is skipped and logged.
  • any other success: false envelope → FAIL. That covers missing_endpoint_permission, any unrecognised code, and the OpenAPI ErrorResponse shape (errors: [{message}]) which carries no code field at all. Unknown means loud, never silent.
  • 429RATE_LIMITED and 500/502/503/504RETRY, declared explicitly because filters are evaluated in order and Ashby wraps those responses in the same success: false envelope, which would otherwise be caught by the FAIL filter and skip the retry it deserves. Codes outside those lists still fall through to the CDK's default mapping.

Instead of the source-wide ConcurrencyLevel that was reverted in #84214 after source-read regressions and a 429 retry warning, this adds an endpoint-scoped HTTPAPIBudget: a MovingWindowCallRatePolicy of 100 requests per PT1M, matched by an HttpRequestRegexMatcher on /application\.listHistory. This is a ceiling (~1.67 req/sec) sitting just above the ~1.31 req/sec this connector sustains single-threaded, so it caps bursts without throttling normal reads. Requests that match no policy are allowed through unchanged (APIBudget.acquire_call logs and proceeds when get_matching_policy returns None), so the other 17 streams are unaffected.

Review guide

  1. airbyte-integrations/connectors/source-ashby/manifest.yamlapi_budget (lines 3–12) and the application_history stream, whose error_handler on the child requester is the part worth reading closely: filter order determines whether a 429 retries or fails. Also a one-line fix at line 1372 adding the required type: AddedFieldDefinition to the pre-existing application_criteria_evaluations transformation, which failed strict Draft-7 validation of the manifest.
  2. airbyte-integrations/connectors/source-ashby/metadata.yaml — minor bump, 0.3.80.4.0.
  3. docs/integrations/sources/ashby.md — stream list, permissions table, the documented warehouse joins, the cost warning, and the changelog.

Verified against the exact CDK the connector runs on (source-declarative-manifest:7.17.4), without live API access — there are no Ashby credentials in GSM or 1Password, so check and read could not be exercised locally:

  • Strict Draft-7 validation of the whole manifest: 0 errors.
  • discover returns 18 streams; the 17 existing streams are unchanged, and application_history resolves with primary key [['id']] and the typed fields above.
  • stop_condition and cursor_value were evaluated through the CDK's own InterpolatedBoolean / InterpolatedString rather than only checked at construction time. {{ not response.moreDataAvailable }} returns False when more data is available and True both when the flag is false and when it is absent entirely; {{ response.nextCursor }} yields the cursor when present and None on the last page. The response.get(...) form behaved identically in the 7.17.4 Jinja sandbox, so the plain attribute form shipped.
  • The error handler was exercised end-to-end against the real manifest under 7.17.4, driving synthetic application.listHistory responses through the CDK: an application_not_found envelope on one partition of several skips only that partition and the read exits 0 with the other partitions' records intact; missing_endpoint_permission and the code-less errors[] shape each emit an error trace, mark the stream INCOMPLETE, and exit non-zero; 429 and 500 each retry five times with 1, 2, 4, 8, 16s backoff; and a healthy multi-page response fires no filter and is byte-for-byte unaffected.
  • Diagnosability of a failing application was checked rather than assumed. HttpResponseFilter.error_message is interpolated with only config, response and headers in 7.17.4 — stream_slice is not in scope and raises Jinja macro has undeclared variables — so the applicationId cannot be interpolated into these messages. On the FAIL path it arrives anyway, because the CDK's internal_message includes the request body (Request (body): '{"applicationId": ..., "limit": 100}'). On the IGNORE path the CDK logs the custom message only, so that message carries Ashby's errorInfo.requestId, which their support docs ask customers to quote.
  • extra_fields semantics were confirmed in CDK source: _extract_extra_fields joins each path with . and, importantly, sets the key to None on KeyError, so {{ stream_slice.extra_fields['status'] }} cannot raise on an application that lacks the field.

User Impact

Additive. A new stream appears in the catalog; no existing stream, schema, or state format changes. Users must enable application_history explicitly and re-run discovery to see it.

Cost — please read before approving. This stream issues at least one request per application, on every sync, with no incremental support. On a real account measured at ~1.31 req/sec sustained single-threaded with ~108,100 applications, the application fan-out alone is on the order of 8 to 24 hours, and pagination adds more requests on top. It is intended to run on its own connection on a slow schedule, not alongside the other streams on an hourly one. This tradeoff is inherent to the endpoint, not to this implementation: there is no way to ask Ashby for "history that changed since X".

A deleted or inaccessible application is now skipped with an INFO log rather than silently contributing zero rows, and any other Ashby error fails the sync instead of completing as if the account had no interview history.

The parent inherits createdAfter from config['start_date'], so start_date must be set early enough to cover the history the user wants — a late start_date silently yields partial history rather than an error.

Version collision: #84274 is open and also targets 0.4.0. Whichever of the two merges second needs to rebase its version bump and changelog entry.

Can this PR be safely reverted and rolled back?

  • YES 💚
  • NO ❌

Link to Devin session: https://app.devin.ai/sessions/7ac246d54a0641de9a9bd4b1c1cca2fb

Co-Authored-By: bot_apk <apk@cognition.ai>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@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.

Co-Authored-By: bot_apk <apk@cognition.ai>
@github-actions

Copy link
Copy Markdown
Contributor

Note

Autopilot progressive rollouts are not enabled for the following modified connector(s):

  • source-ashby

This is a courtesy heads-up only — it does not block merge or fail any check.
To enable automatic progressive rollouts for the connector(s) above, comment
/enable-autopilot-rollouts on this PR. This sets defaultRolloutMode: autopilot
and enableProgressiveRollout: true in each connector's metadata.yaml,
preserving any existing autopilotConfig.

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

source-ashby Connector Test Results

3 tests   1 ✅  3s ⏱️
1 suites  2 💤
1 files    0 ❌

Results for commit 468ab93.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Deploy preview for airbyte-docs ready!

Project:airbyte-docs
Status: ✅  Deploy successful!
Preview URL:https://airbyte-docs-7op2n81x6-airbyte-growth.vercel.app
Latest Commit:468ab93

Deployed with vercel-action

Copilot AI 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.

Pull request overview

Adds a new application_history stream to the source-ashby declarative connector to expose per-application interview stage entry/exit timestamps (from POST /application.listHistory), along with endpoint-scoped rate limiting and accompanying docs/version updates.

Changes:

  • Introduces application_history as a full-refresh substream of applications, including cursor pagination and a declared primary_key: [id].
  • Adds an endpoint-scoped api_budget policy to cap calls to /application.listHistory.
  • Updates connector version and documentation to surface the new stream and its operational/cost implications.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

File Description
docs/integrations/sources/ashby.md Documents the new stream, permissions, usage/join guidance, cost warning, and changelog entry.
airbyte-integrations/connectors/source-ashby/metadata.yaml Bumps the connector image tag to 0.4.0.
airbyte-integrations/connectors/source-ashby/manifest.yaml Adds api_budget, fixes an AddedFieldDefinition type, and defines the new application_history stream and parent substream.
airbyte-integrations/connectors/source-ashby/AGENTS.md Updates contributor guidance to include the new stream’s characteristics and operational notes.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +1477 to +1480
page_size_option:
type: RequestOption
inject_into: body_json
field_name: limit

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Good catch on the inconsistency, but it points the other way: limit is correct and the existing per_page usages are the latent bug. Ashby's ApplicationListRequest is additionalProperties: false with syncToken, cursor, limit, createdAfter, createdBefore, status, jobId, and expand — there is no per_page parameter anywhere in the API. So the streams injecting per_page are most likely having their page size silently ignored today and falling back to Ashby's default page size, which is exactly why this connector's measured throughput is as low as it is.

I'm not fixing that here on purpose. Correcting per_page to limit across the existing streams changes the request shape and page count for every stream in the connector, which deserves its own PR with its own version bump and its own regression run rather than riding along inside a new-stream PR — especially with #84274 open against this same manifest. The new stream uses the documented parameter so it's right from the start, and I've flagged the cleanup separately.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🚫 Not fixing here — filed as #84394 instead. Disposition marker plus the tracking issue for the per_page cleanup, which I couldn't add to the reply above (the API rejects edits to inline review comments from this account).

Comment on lines +1522 to +1524
id:
type: string
format: uuid

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Deliberate, and I'd like to keep it non-nullable. id is this stream's declared primary key, and Ashby's ApplicationHistory response schema marks it required, so a null there would mean an unkeyable record rather than a value we should quietly accept. The nullable-union style you're citing on applications.properties.id is a real inconsistency, but it's the pre-existing side of it: that stream declares primary_key: [id] while typing id as ["null", "string"], which is the combination that actually risks trouble. Tightening applications is out of scope here — this PR deliberately touches no existing stream, since #84274 is open against this same manifest.

Worth noting the typing has no effect on whether a null gets through: additionalProperties: true plus the default transformer means a null id would still be emitted, just flagged against the schema. So this is about declaring intent accurately, and "the primary key is always present" is the accurate intent.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

🚫 Not fixing — disposition marker for the reply above, which I can't edit in place (the API rejects edits to inline review comments from this account).

@airbyte-support-bot

Copy link
Copy Markdown
Contributor

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

Reason: Draft PR, CI checks passing, and no /ai-prove-fix has run yet on this branch — prove-fix is the next pipeline stage before review.

Devin session

@octavia-bot

octavia-bot Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

🔍 AI Prove Fix session starting... Running readiness checks and testing against customer connections. 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

🧪 Prove-Fix Validation — source-ashby #84392

Verdict: 🟡 No Regression Detected — Fix Not Exercised

Against a live production Ashby account, the prerelease is behaviorally identical to 0.3.8 on all 17 pre-existing streams, and application_history shows up in DISCOVER. What could not be proven is that application_history actually returns stage-transition rows: no read of that stream was possible with the credentials and catalogs available (details below), so criteria 2–4 of the evidence plan are untested.

Connector: source-ashby (manifest-only, community, alpha) · 0.3.80.4.0
Change: adds application_history stream (POST /application.listHistory), child of an inline /application.list parent; adds a /application\.listHistory-scoped rate policy (100 req / 1 min).
Prerelease: airbyte/source-ashby:0.4.0-preview.ae64cffpublish run
Baseline (control): published 0.3.8 (no known-bad version named in the issue, so no override_control_image)

Evidence

Check Result
SPEC ✅ identical
CHECK ✅ passes on both versions
DISCOVER ✅ 17 → 18 streams; application_history present on target only; all 17 existing stream schemas unchanged
READ — existing streams ✅ 43,113 records on both versions, per-stream delta 0 across all 8 streams that returned data; no missing/duplicate PKs
READapplication_history ⚪ not exercised (stream absent from the configured catalog available for the read)
candidates was flagged with value diffs — this is upstream API nondeterminism, not a regression

Two independent comparison runs flagged candidates field-value differences (75, then 83). Analysis of the record artifacts:

  • Diffs are confined to two fields: fileHandles (Ashby-side file IDs / signed handles / converted filenames, which rotate) and school.
  • The differing record sets are not reproducible: only 153 of roughly 312 differing records are common to both runs, and each run flags a different number of fields.
  • On records where only school differs, updatedAt is byte-identical on both sides — the record was not modified upstream, the API simply returned a different value from the candidate's education entries.
  • Record counts, PK sets, and PK integrity are identical every time.
  • The PR diff is +177 / -0 lines in manifest.yaml: the candidates stream definition is untouched, so no code path exists by which the new stream could change it.

Conclusion: the Ashby API returns nondeterministic values for these fields between successive reads. This is pre-existing API behavior surfaced by strict field-equality comparison, not a behavior change introduced by this PR.

Why application_history could not be read
  1. The first attempt used integration-test credentials and failed before the connector ran (Failed to fetch integration test config from GSM for source-ashbyConfig is required for check command). There is no source-ashby integration-test secret provisioned, so there is no first-party Ashby account to read from.
  2. The subsequent attempts used a real connection's config and configured catalog. That catalog was created before this PR, so it does not contain application_history — and the regression harness filters an existing configured catalog rather than re-discovering streams, so the new stream cannot be added to the read that way.

To close this gap, one of:

  • Provision Ashby integration-test credentials (a SECRET_SOURCE-ASHBY__CREDS entry) so the GSM path can read every discovered stream, including new ones. This is the durable fix and also unblocks future source-ashby prove-fix runs.
  • Pin a consenting connection to the prerelease, refresh its schema and enable application_history for one sync. This touches a customer connection, so it needs the Slack HITL approval gate before any pin.

Pre-flight checks

  • Viability: ✅ Uses only built-in declarative components (SimpleRetriever, DefaultPaginator + CursorPagination, SubstreamPartitionRouter, AddFields, InlineSchemaLoader) — no custom Python. enteredStageAt / leftStageAt / stageId are exactly the stage-transition timestamps the requester wanted, and the stream carries application_id + application_status + application_created_at so it can be joined to interview_schedules downstream.
  • Design intent: ✅ Full-refresh only is intentional — /application.listHistory exposes no date filter, and history rows are mutable. ⚠️ Cost note: the stream fans out one request per application in scope (start_date-filtered parent), so runtime scales with application count; the new rate policy bounds it to 100 req/min.
  • Safety: ✅ No malicious or obfuscated code, no new hosts (api.ashbyhq.com only), no credential handling beyond the existing BasicHttpAuthenticator, no exfiltration paths.
  • Breaking change: ✅ Non-breaking / additive. No stream removed or renamed, no field types changed, no primary-key, cursor, state or spec changes. Minor bump 0.3.80.4.0 is appropriate for a new stream pre-1.0.
  • Reversibility: ✅ Rolling back to 0.3.8 is safe — no state format or spec change; the only effect is that application_history stops being discoverable.
  • ⚠️ Worth a reviewer's eye: 0.3.8-rc.5 reverted an earlier api_budget (plus concurrency) after rollout monitoring found source-read regressions and 429 warnings. This PR reintroduces an api_budget, but scoped by an HttpRequestRegexMatcher to /application\.listHistory only, and no concurrency change comes with it. The regression runs confirm existing streams are unaffected by its presence (identical counts and PKs on every run).

Test cases run

  1. Integration-test credentials, all streams, comparison mode — run — ⚪ infrastructure failure, no connector behavior observed (no GSM config).
  2. Real connection config + catalog, all configured streams, comparison mode — run — ✅ SPEC/CHECK/DISCOVER pass, existing-stream read identical, candidates field diffs flagged.
  3. Repeat of case 2 narrowed to applications + candidatesrun — ✅ confirms the candidates diffs are nonreproducible upstream nondeterminism.

Recommended next steps

  1. Provision source-ashby integration-test credentials, then re-run this validation to exercise application_history end to end (criteria 2–4). Alternatively, request HITL approval to pin one consenting connection.
  2. The change is safe to canary independently of that gap — /ai-canary-prerelease — since it is additive, reversible, and proven not to alter existing stream output.
  3. Once merged and rolled out, the customer's "Entered At" report field is served by joining application_history.enteredStageAt to interview_schedules on application + stage id.

Detailed, non-sanitized evidence is in the linked private issue.

🤖 Automated validation — Devin session

@devin-ai-integration devin-ai-integration Bot added the hyd-prove Hydra: ai-prove-fix stage has run label Aug 14, 2026
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Context for the in-flight /ai-prove-fix run, so it doesn't spend the effort rediscovering this: a live read of application_history is not reachable through the regression harness, and no Ashby credential exists to read around it.

What is already validated, from this PR's own session:

  • spec + check + discover against a live Cloud Ashby connection, PR build 0.4.0 vs released 0.3.8 — both passed, and the discover diff came back "additive_only": true with "changed_streams": ["application_history"] and all 17 pre-existing streams identical. Run: https://github.com/airbytehq/airbyte-ops-mcp/actions/runs/31756733796
  • Locally: strict Draft-7 validation of the manifest with 0 errors, discover returning 18 streams with the new stream's primary key resolving to [['id']], and the stop_condition / cursor_value expressions evaluated through the CDK 7.17.4 interpolation rather than only at manifest construction.
  • CI: green, 36 checks.

What failed, and why it is not a defect in this change:

ValueError: None of the selected streams {'application_history'} were found in the catalog.
Available streams: {'offers', 'job_postings', 'jobs', 'departments', 'applications',
'interview_schedules', 'interview_stages', 'interviews', 'candidates', 'users'}

filter_configured_catalog (src/airbyte_ops_mcp/regression_tests/config_overrides.py) selects only from the existing connection's configured catalog, so a stream that connection has never had can never be selected by --selected-streams. Reading it would require refreshing the schema on a production connection belonging to an unrelated customer, which this session declined to do. Run: https://github.com/airbytehq/airbyte-ops-mcp/actions/runs/31756752957

So the remaining gap is specific: the pagination stop_condition has never met Ashby's real response envelope, and the roughly 8–24 hour cost estimate is extrapolated from a measured ~1.31 req/s rather than observed on this stream. Closing it needs an Ashby API key for a test account — there is none in GSM or 1Password — and that request is pending with the requester. Please don't burn the run re-deriving the wall.

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Pre-release Connector Publish Started

Publishing pre-release build for connector source-ashby.
PR: #84392

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

View workflow run
Pre-release Publish: SUCCESS

Docker image (pre-release):
airbyte/source-ashby:0.4.0-preview.ae64cff

Docker Hub: https://hub.docker.com/layers/airbyte/source-ashby/0.4.0-preview.ae64cff

Registry JSON:

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Follow-up for the prove-fix run: there are no GSM integration-test credentials for source-ashby — Case 1 cannot work as planned.

Evidence from that run itself, https://github.com/airbytehq/airbyte-ops-mcp/actions/runs/31797791741:

Error: Failed to fetch integration test config from GSM for source-ashby.
{"type":"LOG","log":{"level":"WARN","message":"Failed to fetch config for source-ashby: PyAirbyteError"}}
...
ValueError: Config is required for check command

Consistent with two other checks: metadata.yaml declares connectorTestSuitesOptions: [{suite: unitTests}] only, with no integrationTests suite and therefore no registered secret, and listing Secret Manager in dataline-integration-testing returns zero secrets matching ashby. SPEC "passed" only because spec needs no config.

So the two viable paths for a live read are: read through a Cloud connection's config (which is what the earlier runs did — --connection-id, and how check and discover were proven against a real Ashby account), or obtain an Ashby API key and register it. But --selected-streams application_history cannot work over a connection either, because filter_configured_catalog matches against that connection's configured catalog and a brand-new stream is never in it:

ValueError: None of the selected streams {'application_history'} were found in the catalog.

An all-streams comparison read over a connection would exercise the 10 configured streams and silently skip the new one — which is the "⚠️ uninformative" outcome already named in the plan above, not a 🟢. A key request is pending with the requester; that is the unblock.

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

Session provenance for my two comments above (they were posted without it, and the API rejects edits to comments from this account): https://app.devin.ai/sessions/7ac246d54a0641de9a9bd4b1c1cca2fb

@airbyte-support-bot

Copy link
Copy Markdown
Contributor

🙋 Escalated per Hands-Free AI Triage Project/ai-prove-fix returned 🟡 No Regression Detected / Fix Not Exercised: all 17 pre-existing streams are byte-identical to 0.3.8 and application_history is discoverable, but the new stream could never be read. There is no SECRET_SOURCE-ASHBY__CREDS entry in GSM, and the regression harness filters an existing configured catalog, so it cannot add a stream that did not exist when that catalog was saved. Automation has no remaining path to runtime evidence: a maintainer needs to provision Ashby integration-test credentials, or approve pinning one consenting connection to the prerelease for a single sync.


Devin session

devin-ai-integration Bot and others added 2 commits August 14, 2026 22:07
Co-Authored-By: bot_apk <apk@cognition.ai>
Co-Authored-By: bot_apk <apk@cognition.ai>
@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Pre-release Connector Publish Started

Publishing pre-release build for connector source-ashby.
PR: #84392

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

View workflow run
Pre-release Publish: SUCCESS

Docker image (pre-release):
airbyte/source-ashby:0.4.0-preview.468ab93

Docker Hub: https://hub.docker.com/layers/airbyte/source-ashby/0.4.0-preview.468ab93

Registry JSON:

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

Labels

connectors/source/ashby hyd-prove Hydra: ai-prove-fix stage has run

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants