Skip to content

fix(source-stripe): Fix invoice_line_items and subscription_items incremental streams#72845

Open
devin-ai-integration[bot] wants to merge 6 commits into
masterfrom
devin/1770241859-stripe-invoice-line-items-fix
Open

fix(source-stripe): Fix invoice_line_items and subscription_items incremental streams#72845
devin-ai-integration[bot] wants to merge 6 commits into
masterfrom
devin/1770241859-stripe-invoice-line-items-fix

Conversation

@devin-ai-integration
Copy link
Copy Markdown
Contributor

@devin-ai-integration devin-ai-integration Bot commented Feb 4, 2026

Link to Devin run: https://app.devin.ai/sessions/756ea1d8dac544ac899ca58aa3b71a4e

Requested by: sophiecuiy

Recreates: #70294

Related issues:

  • airbytehq/oncall#8683 (invoice_line_items)
  • airbytehq/oncall#10756 (subscription_items)

What

Fixes both invoice_line_items and subscription_items incremental streams which were incorrectly emitting parent objects instead of child items.

Root cause (same for both streams): The incremental streams use the Stripe events endpoint which returns parent objects (invoices/subscriptions) with nested child arrays. The streams were emitting the entire parent object instead of extracting and emitting each child item separately.

Stream Events Used Was Emitting Should Emit
invoice_line_items invoice.* Invoice (in_xxx) Line items (il_xxx) from lines.data[]
subscription_items customer.subscription.* Subscription (sub_xxx) Subscription items (si_xxx) from items.data[]

How

Uses RecordExpander component with expand_records_from_field and remain_original_record parameters to apply the same fix pattern to both streams:

  1. Extract nested items: Use RecordExpander to expand the nested array and emit each item as a separate record
  2. Preserve parent context: Use remain_original_record: true to embed the parent object temporarily
  3. Filter unexpanded records: Add record_filter to only emit records with original_record field
  4. Extract parent fields: Add transformations to extract parent metadata to child records
  5. Clean up: Remove the original_record field from final output

Review guide

  1. invoice_line_items (manifest.yaml ~lines 1435-1487):

    • expand_records_from_field: ["lines", "data"]
    • Extracts: invoice_id, invoice_created, invoice_updated
  2. subscription_items (manifest.yaml ~lines 1576-1670):

    • expand_records_from_field: ["items", "data"]
    • Extracts: subscription_id, subscription_created, subscription_updated
    • Note: Full refresh stream also updated to include all three parent metadata fields for schema consistency
  3. Breaking change metadata (metadata.yaml):

    • Version bumped to 6.0.0
    • Added breakingChanges entry with upgrade deadline 2026-02-19
    • Scoped impact limited to invoice_line_items and subscription_items streams
    • Includes link to migration guide
  4. Migration guide (docs/integrations/sources/stripe-migrations.md):

    • Documents the data structure change
    • Provides step-by-step migration instructions
    • Uses reusable MigrationGuide component (import placed after header per CI requirements)
  5. Connector docs (docs/integrations/sources/stripe.md):

    • Added v6.0.0 changelog entry
    • Updated stream list to mark both streams as (Incremental)

⚠️ Key items for reviewer to verify:

  • Confirm RecordExpander CDK component is available in the current CDK version (original PR was blocked on CDK PR Basic Normalization doesn't Normalize #859)
  • Verify schema consistency between full refresh and incremental modes for both streams
  • Review migration guide for completeness and clarity

User Impact

Positive:

  • Users will receive individual child items instead of parent objects for both streams
  • Incremental syncs will work correctly for both streams
  • Each child item includes parent metadata for context

Negative:

  • Breaking change in data structure for BOTH streams
  • Users may need to update downstream transformations
  • Historical data will have different structure than new data

Can this PR be safely reverted and rolled back?

  • YES 💚
  • NO ❌

Reason: This changes the fundamental data structure of both streams. Reverting would cause inconsistency between historical and new data.


Updates since last revision

Latest (d16603c): Fixed migration guide header order:

  • Moved import MigrationGuide statement after the # Stripe Migration Guide header (CI requires header as first line)

Previous (77d67ea): Addressed docs review correctness and completeness notes:

  • Fixed subscription_items full refresh stream to include subscription_id and subscription_created fields (was only adding subscription_updated, causing schema inconsistency between sync modes)
  • Added MigrationGuide component import and usage in migration guide
  • Added migration guide link to breakingChanges message in metadata.yaml

Previous (a7fda3a): Documentation updates per reviewer feedback:

  • Applied linting fix in migration guide (removed extra space in heading)
  • Added v6.0.0 changelog entry to main Stripe docs
  • Updated stream descriptions to mark Invoice Line Items and Subscription Items as (Incremental)

Initial: Added breaking change documentation per Gate 3 remediation requirements:

  • Bumped version to 6.0.0 (major version bump for breaking change)
  • Added breakingChanges entry in metadata.yaml with scoped impact
  • Created migration guide in docs/integrations/sources/stripe-migrations.md

…remental streams

Uses RecordExpander component to extract nested items from parent objects:
- invoice_line_items: extracts line items from invoice.lines.data
- subscription_items: extracts subscription items from subscription.items.data

Both streams now emit individual child items instead of parent objects,
with parent metadata (id, created, updated) preserved on each child record.

Co-Authored-By: sophie.cui@airbyte.io <sophie.cui@airbyte.io>
@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 and CI monitoring

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Feb 4, 2026

👋 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.
  • ❇️ AI Testing and Review:
    • /ai-docs-review - Provides AI-powered documentation recommendations for PRs with connector changes.
    • /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.
  • 🚀 Connector Releases:
    • /publish-connectors-prerelease - Publishes pre-release connector builds (tagged as {version}-preview.{git-sha}) for all modified connectors in the PR.
    • /bump-progressive-rollout-version - Bumps connector version with an RC suffix (2.16.10-rc.1) for progressive rollouts (enableProgressiveRollout: true).
      • Example: /bump-progressive-rollout-version changelog="Add new feature for progressive rollout"
  • ☕️ 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
    • /bump-bulk-cdk-version bump=patch changelog='foo' - Bump the Bulk CDK's version. bump can be major/minor/patch.
  • 🐍 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.

@sophiecuiy
Copy link
Copy Markdown
Contributor

sophiecuiy commented Feb 4, 2026

/ai-prove-fix

AI Prove Fix Started

Running readiness checks and testing against customer connections.
View workflow run
🔍 AI Prove Fix session starting... Running readiness checks and testing against customer connections. View playbook

Devin AI session created successfully!

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Feb 4, 2026

source-stripe Connector Test Results

209 tests   206 ✅  20m 47s ⏱️
  2 suites    3 💤
  2 files      0 ❌

Results for commit ccf737a.

♻️ This comment has been updated with latest results.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Feb 4, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-stripe.
PR: #72845

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

View workflow run
Pre-release Publish: SUCCESS

Docker image (pre-release):
airbyte/source-stripe:5.15.17-preview.8d02b64

Docker Hub: https://hub.docker.com/layers/airbyte/source-stripe/5.15.17-preview.8d02b64

Registry JSON:

@sophiecuiy
Copy link
Copy Markdown
Contributor

Fix Validation Evidence

Outcome: Could not Run Tests (Live connection testing blocked - non-reversible change requires human approval)

Evidence Summary

Pre-flight checks completed. The fix uses RecordExpander to correctly extract nested child items from parent objects. However, this PR is explicitly marked as NOT reversible (breaking change in data structure), which blocks live connection testing without explicit human approval. Isolated regression tests have been triggered and a pre-release image is available for manual validation.

Next Steps

Before this PR can be validated on live connections:

  1. Version Bump Required: This is a breaking change that requires a major version bump (e.g., 5.x.x → 6.0.0)
  2. Migration Guide Required: Users need documentation on how to handle the data structure change
  3. Human Approval Required: An Airbyte team member must explicitly approve live connection testing by commenting on this PR or the oncall issue

To proceed with live testing after approval:

  • Reply to this comment with approval to test on internal connections
  • Or run /ai-canary-prerelease after addressing the above requirements

Regression Tests:


Connector & PR Details

Connector: source-stripe
PR: #72845
Pre-release Version: 5.15.17-preview.8d02b64
Pre-release Workflow: https://github.com/airbytehq/airbyte/actions/runs/21690639168 (SUCCESS)
Related Issues: airbytehq/oncall#8683 (invoice_line_items), airbytehq/oncall#10756 (subscription_items)

Evidence Plan

Proving Criteria

  • Records emitted have IDs starting with il_ (invoice line items) or si_ (subscription items) instead of parent IDs (in_ or sub_)
  • Parent metadata fields (invoice_id, invoice_created, subscription_id, subscription_created) are correctly extracted
  • Incremental syncs work correctly for both streams

Disproving Criteria

  • Records still have parent object IDs (in_ or sub_)
  • Missing parent metadata fields
  • Errors during sync

Potential Test Cases (Internal Airbyte Org)

Found 10 internal connections with invoice_line_items stream enabled, including:

  • Stripe -> ab-analytics in _airbyte-internal-team workspace
  • stripe_config_dev_null in integration-test-sandboxes workspace
  • Multiple test connections in various internal workspaces

Note: Live testing blocked pending human approval due to non-reversible nature of change.

Pre-flight Checks
  • Viability: Fix uses RecordExpander CDK component to correctly extract nested child items
  • Safety: No malicious code, changes confined to manifest.yaml
  • Reversibility: NOT REVERSIBLE - Breaking change in data structure for both streams

Reversibility Concern:
The PR description explicitly states: "This changes the fundamental data structure of both streams. Reverting would cause inconsistency between historical and new data."

Per the playbook, non-reversible changes require:

  1. Major version bump
  2. Migration guide
  3. Explicit human approval before live connection testing
Design Intent Check

WARNING: Before merging, please verify this is actually a bug and not intentional behavior.

The current behavior emits parent objects (invoices/subscriptions) from the events endpoint. This may have been intentional to provide full context. The fix changes this to emit individual child items, which is a significant data structure change.

Questions for reviewers:

  1. Was the original behavior intentional for providing full invoice/subscription context?
  2. Will downstream users be impacted by receiving individual line items instead of full parent objects?
  3. Should this be a new stream (e.g., invoice_line_items_v2) rather than modifying the existing stream?

Session: https://app.devin.ai/sessions/5c6a54c91f93497b819be1cd28d13f52

@sophiecuiy
Copy link
Copy Markdown
Contributor

sophiecuiy commented Feb 4, 2026

/ai-review

PR AI Review Started

Evaluating connector PR for safety and quality.
View workflow run
AI PR Review starting...

Reviewing PR for connector safety and quality.
View playbook

Devin AI session created successfully!

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

AI PR Review Report

Review Action: REQUEST CHANGES

Gate Status
1. CI/Tests PASS
2. Security PASS
3. Safety FAIL
4. Ops Risk PASS
5. Validation UNKNOWN
6. PR Quality PASS
🔧 Remediation Required

Required Actions

Gate 3: Safety/Reversibility - FAIL

The PR is explicitly marked as NOT reversible in the description:

"This changes the fundamental data structure of both streams. Reverting would cause inconsistency between historical and new data."

This is a breaking change that modifies the data structure of invoice_line_items and subscription_items streams. To remediate:

  1. Version Bump Required: Increment to a major version (e.g., 5.x.x → 6.0.0) per Breaking Changes Guide
  2. Migration Guide Required: Create a migration guide at docs/integrations/sources/stripe-migrations.md documenting:
    • What changed (parent objects → child items)
    • Who is affected (users syncing invoice_line_items or subscription_items)
    • Steps to migrate downstream transformations
  3. Breaking Change Metadata: Add breakingChanges entry to metadata.yaml with:
    • message: Summary for in-app notification
    • upgradeDeadline: At least 7 days from release
    • scopedImpact: Specify affected streams

Gate 5: Pre-Release Validation - UNKNOWN

The /ai-prove-fix run was blocked pending human approval due to the non-reversible nature of this change. To proceed:

  1. Obtain explicit human approval for live connection testing
  2. Re-run /ai-prove-fix after approval, OR
  3. Provide justification in PR description explaining why validation is not required

📋 PR Details & Eligibility

Connector & PR Info

Connector(s): source-stripe
PR: #72845
HEAD SHA: 8d02b6476bc47273decb37b68df15dadda0e262f
Session: https://app.devin.ai/sessions/53e66dbb66a54de8b4036eb257d0c847

Auto-Approve Eligibility

Eligible: No
Category: not-eligible
Reason: This PR contains functional code changes that modify stream behavior (record extraction logic). It is not docs-only, additive spec, patch/minor deps, or comment/whitespace-only.

Review Action Details

REQUEST CHANGES - Gate 3 (Safety/Reversibility) has definitively FAILED because the PR explicitly acknowledges this is a breaking, non-reversible change. The workflow automation will submit a REQUEST_CHANGES review via octavia-bot.

Note: This bot can approve PRs when all gates pass AND the PR is eligible for auto-approval (docs-only, additive spec changes, patch/minor dependency bumps, or comment/whitespace-only changes). PRs with breaking changes require human review and proper breaking change documentation.

🔍 Gate Evaluation Details

Gate-by-Gate Analysis

Gate Status Enforced? Details
1. CI/Tests PASS Yes All core CI checks passed (Connector CI, Test, Lint, Format)
2. Security PASS Yes No security-sensitive patterns detected
3. Safety/Reversibility FAIL Yes PR explicitly marked as NOT reversible - breaking change
4. Operational Risk PASS Yes No pagination, retry, timeout, or rate limit changes
5. Pre-Release Validation UNKNOWN Yes Testing blocked pending human approval
6. PR Quality PASS Yes Description present, changelog updated, issues linked

Gate 1: CI/Tests - PASS

Core CI Checks:

  • Connector CI Checks Summary: PASS (required)
  • Test source-stripe Connector: PASS (209 tests, 206 passed, 3 skipped)
  • Lint source-stripe Connector: PASS
  • Format Check: PASS (required)
  • Check Changelog Updated: PASS (required)
  • Enforce PR structure: PASS (required)

Non-blocking failure: Add Labels to PRs - explicitly marked "Safe to Merge on fail"

Coverage Evidence: Exempt - manifest.yaml changes are covered by connector unit tests which passed.

Gate 2: Security - PASS

No security-sensitive patterns detected in diff:

  • No authentication/credential changes
  • No new API endpoints or URL modifications
  • No secret handling changes
  • Changes confined to record extraction logic

Gate 3: Safety/Reversibility - FAIL

Trigger: PR description explicitly states:

  • "Can this PR be safely reverted and rolled back? NO"
  • "This changes the fundamental data structure of both streams"

Breaking Change Analysis:

  • invoice_line_items: Now emits il_xxx records instead of in_xxx parent objects
  • subscription_items: Now emits si_xxx records instead of sub_xxx parent objects
  • Schema structure fundamentally changed

Gate 4: Operational Risk - PASS

No operational risk patterns detected:

  • No pagination strategy changes
  • No retry/backoff modifications
  • No timeout changes
  • No rate limit handling changes
  • Changes are to record extraction/transformation only

Gate 5: Pre-Release Validation - UNKNOWN

Evidence Search:

  • MCP verification: Unable to query (Cloud SQL Proxy not running)
  • CI labels: No live-tests-passed or prerelease-validated labels
  • Author justification: None provided

Context: The /ai-prove-fix run explicitly blocked testing:

"Could not Run Tests (Live connection testing blocked - non-reversible change requires human approval)"

Pre-release version 5.15.17-preview.8d02b64 was published but not tested on live connections.

Gate 6: PR Quality - PASS

  • Description: Present and detailed
  • Changelog: Updated (CI check passed)
  • Related Issues: Linked (airbytehq/oncall#8683, airbytehq/oncall#10756)
  • Review Guide: Included with specific line references
📚 Evidence Consulted

Evidence

  • Changed files: 1 file (airbyte-integrations/connectors/source-stripe/manifest.yaml)
  • Lines changed: +64 -24
  • CI checks: 31 passed, 1 failed (non-blocking), 13 skipped
  • PR labels: None relevant to validation
  • PR description: Present with detailed explanation
  • Existing bot reviews: None for this HEAD SHA

Files Analyzed

airbyte-integrations/connectors/source-stripe/manifest.yaml

Changes Summary:

  • Added RecordExpander to invoice_line_items stream (lines ~1435-1487)
  • Added RecordExpander to subscription_items stream (lines ~1604-1656)
  • Modified transformations to extract parent metadata to child records
  • Added RemoveFields to clean up original_record field
❓ How to Respond

Providing Context or Justification

You can add explanations that the bot will see on the next review:

Option 1: PR Description (recommended)
Add a section to your PR description:

## AI PR Review Justification

### Gate 3 (Safety/Reversibility)
[Your explanation here - e.g., why this breaking change is necessary and how users will be supported]

### Gate 5 (Pre-Release Validation)
[Your explanation here - e.g., why validation is not required or how it will be obtained]

Option 2: PR Comment
Add a comment starting with:

AI PR Review Justification:
[Your explanation here]

After adding your response, re-run /ai-review to have the bot evaluate it.

Note: For Gate 3 (Safety), justifications provide context but cannot override the FAIL status for breaking changes. The PR requires:

  1. Major version bump
  2. Migration guide documentation
  3. Breaking change metadata in metadata.yaml

Once these requirements are met, re-run /ai-review for re-evaluation.

Copy link
Copy Markdown
Contributor

@octavia-bot octavia-bot Bot left a comment

Choose a reason for hiding this comment

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

AI PR Review: Gates Failed

This PR has failing gates that require attention before merge. See the gate report comment above for details and remediation steps.

This review was automatically submitted by the AI PR Review system.

@sophiecuiy
Copy link
Copy Markdown
Contributor

follow remediations for gate 3

…for v6.0.0

Co-Authored-By: sophie.cui@airbyte.io <sophie.cui@airbyte.io>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Feb 5, 2026

Deploy preview for airbyte-docs ready!

✅ Preview
https://airbyte-docs-g9byqyryf-airbyte-growth.vercel.app

Built with commit ccf737a.
This pull request is being automatically deployed with vercel-action

@sophiecuiy
Copy link
Copy Markdown
Contributor

can you find a live connection first and tell me which one before actually testing it?

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Live Connections Found for Testing

I found the following internal Airbyte connections that have the affected streams enabled:

Connections with invoice_line_items stream:

Connection Name Workspace Connection URL
stripe_config_dev_null integration-test-sandboxes Link
Stripe -> ab-analytics _airbyte-internal-team Link
Stripe → End-to-End Testing (/dev/null) aldo.gonzalez.testing.replicate_integration Link

Connections with subscription_items stream:

Connection Name Workspace Connection URL
stripe_config_dev_null integration-test-sandboxes Link
Stripe -> ab-analytics _airbyte-internal-team Link
Stripe (descript oc but running master) → e2etest alexandre-default Link

Recommended for Testing

The stripe_config_dev_null connection in the integration-test-sandboxes workspace (0f3c8a84-53e2-4a33-89a9-26bf36a2367c) has both streams enabled and outputs to /dev/null, making it ideal for safe testing.

Let me know which connection you'd like me to use for testing.

@sophiecuiy
Copy link
Copy Markdown
Contributor

yes use stripe_config_dev_null for live testing. make sure to do this in tangent with this pr airbytehq/airbyte-python-cdk#859

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Live Testing Triggered

I've triggered a regression test using the stripe_config_dev_null connection (ID: 0f3c8a84-53e2-4a33-89a9-26bf36a2367c).

Workflow: https://github.com/airbytehq/airbyte-ops-mcp/actions/runs/21725597380

This will build the connector from this PR and run tests against the live connection. I'll report back with the results.

Note: This test depends on the CDK PR airbytehq/airbyte-python-cdk#859 being available. If the RecordExpander component isn't available in the CDK version used, the test may fail with a component not found error.

@sophiecuiy
Copy link
Copy Markdown
Contributor

sophiecuiy commented Feb 5, 2026

/ai-review

PR AI Review Started

Evaluating connector PR for safety and quality.
View workflow run
AI PR Review starting...

Reviewing PR for connector safety and quality.
View playbook

Devin AI session created successfully!

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Reviewing PR now. Evaluating all 6 gates against HEAD SHA 06d0eeaf1c27bbb0d9161a139f829fb0cec1be74. This is a re-run after Gate 3 remediation.

Session: https://app.devin.ai/sessions/95c20eb82b1c480199b8e0888b971842

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

AI PR Review Report

Review Action: NO ACTION (INCONCLUSIVE)

Gate Status
1. CI/Tests PASS
2. Security PASS
3. Safety PASS
4. Ops Risk PASS
5. Validation UNKNOWN
6. PR Quality PASS

All gates now pass except Gate 5 (Pre-Release Validation), which remains UNKNOWN due to incomplete live testing evidence. Prior REQUEST CHANGES review (for Gate 3) may be dismissed by a maintainer since breaking change documentation is now complete.


📋 PR Details & Eligibility

Connector & PR Info

Connector(s): source-stripe
PR: #72845
HEAD SHA: 06d0eeaf1c27bbb0d9161a139f829fb0cec1be74
Session: https://app.devin.ai/sessions/95c20eb82b1c480199b8e0888b971842

Auto-Approve Eligibility

Eligible: No
Category: not-eligible
Reason: This PR contains functional code changes to manifest.yaml that modify stream record extraction logic, plus a major version bump and migration guide. It is not docs-only, additive spec, patch/minor deps, or comment/whitespace-only.

Review Action Details

NO ACTION (INCONCLUSIVE) - No gates have definitively FAILED, but Gate 5 (Pre-Release Validation) is UNKNOWN because live testing evidence is not yet available. No PR review submitted. Human review required.

Re-run context: The previous /ai-review at SHA 8d02b647 resulted in Gate 3 FAIL (missing breaking change documentation). The author has since added:

  • Version bump to 6.0.0
  • breakingChanges metadata in metadata.yaml
  • Migration guide at docs/integrations/sources/stripe-migrations.md

Gate 3 now PASSES. The prior REQUEST CHANGES review from octavia-bot may be dismissed by a maintainer.

Note: This bot can approve PRs when all gates pass AND the PR is eligible for auto-approval (docs-only, additive spec changes, patch/minor dependency bumps, or comment/whitespace-only changes). PRs with functional code changes require human review even if all gates pass.

🔍 Gate Evaluation Details

Gate-by-Gate Analysis

Gate Status Enforced? Details
1. CI/Tests PASS Yes All core CI checks passed (209 tests, 206 passed, 3 skipped). Coverage WARNING: manifest.yaml modified without test file changes.
2. Security PASS Yes No security-sensitive patterns detected in diff
3. Safety/Reversibility PASS Yes Breaking change properly documented (v6.0.0, migration guide, scoped metadata)
4. Operational Risk PASS Yes No pagination, retry, timeout, or rate limit changes
5. Pre-Release Validation UNKNOWN Yes Live testing initiated but no completion evidence found
6. PR Quality PASS Yes Description present, changelog updated, issues linked

Gate 1: CI/Tests - PASS

Core CI Checks:

  • Connector CI Checks Summary: PASS (required)
  • Test source-stripe Connector: PASS (209 tests, 206 passed, 3 skipped)
  • Lint source-stripe Connector: PASS
  • Format Check: PASS (required)
  • Check Changelog Updated: PASS (required)
  • Enforce PR structure: PASS (required)
  • Bulk CDK version check result: PASS (required)
  • Build Airbyte Docs: PASS
  • Docs / MarkDownLint: PASS
  • Docs / Vale: PASS

Excluded from Gate 1 (pre-release checks): ${...} Pre-Release Checks - skipped

Coverage Evidence:

  • Source Files Modified: airbyte-integrations/connectors/source-stripe/manifest.yaml
  • Test Files Modified: None
  • Coverage Evidence: WARNING - No test files modified for source code changes. Consider adding tests for new code paths.

Gate 2: Security - PASS

No security-sensitive patterns detected in diff:

  • No authentication/credential changes
  • No new API endpoints or URL modifications
  • No secret handling changes
  • No environment variable changes
  • Changes confined to record extraction/transformation logic in manifest.yaml

Gate 3: Safety/Reversibility - PASS

Previous status: FAIL (at SHA 8d02b647) - missing breaking change documentation

Current status: PASS - all breaking change requirements now met:

  • Version bump: 5.15.176.0.0 (major version for breaking change)
  • breakingChanges metadata in metadata.yaml:
    • message: Describes the data structure change
    • upgradeDeadline: 2026-02-19 (14 days from today)
    • scopedImpact: ["invoice_line_items", "subscription_items"]
  • Migration guide: docs/integrations/sources/stripe-migrations.md
    • Documents what changed (parent objects → child items)
    • Provides step-by-step migration instructions
    • Notes downstream impact

Breaking change analysis:

  • invoice_line_items: Now emits il_xxx line item records instead of in_xxx invoice objects
  • subscription_items: Now emits si_xxx subscription item records instead of sub_xxx subscription objects

Gate 4: Operational Risk - PASS

No operational risk patterns detected in diff:

  • No pagination strategy changes
  • No retry/backoff modifications
  • No timeout changes
  • No rate limit handling changes
  • Changes are exclusively to record extraction (RecordExpander) and transformation (AddFields, RemoveFields)

Gate 5: Pre-Release Validation - UNKNOWN

Evidence search (Priority 1 - MCP):

  • Queried prod connector versions for source-stripe (definition ID: e094cb9a-26de-4645-8761-65c0c425d1de)
  • Pre-release 5.15.17-preview.8d02b64 NOT found in prod DB (5 other preview versions exist but none match this PR)
  • Cannot query sync results without a registered version ID

Evidence search (Priority 2 - CI labels):

  • No live-tests-passed label
  • No prerelease-validated label

Evidence search (Priority 3 - Author justification):

  • No AI PR Review Justification section in PR description for Gate 5

Context:

To resolve Gate 5, either:

  1. Wait for live testing results and re-run /ai-review, OR
  2. Add a justification in the PR description explaining why validation evidence is sufficient, OR
  3. Confirm the stripe_config_dev_null regression test results

Gate 6: PR Quality - PASS

  • Description: Present and detailed (What/How/Review Guide/User Impact sections)
  • Changelog: Updated (CI check passed)
  • Related Issues: Linked (airbytehq/oncall#8683, airbytehq/oncall#10756)
  • Review Guide: Included with specific line references
  • Breaking Change Documentation: Complete
📚 Evidence Consulted

Evidence

  • Changed files: 3 files
    • airbyte-integrations/connectors/source-stripe/manifest.yaml (+80 -25)
    • airbyte-integrations/connectors/source-stripe/metadata.yaml (+7 -1)
    • docs/integrations/sources/stripe-migrations.md (+33 -0)
  • CI checks: 34 passed, 8 skipped, 0 failed, 0 pending
  • PR labels: No validation-relevant labels
  • PR description: Present with detailed explanation
  • Existing bot reviews: REQUEST CHANGES by octavia-bot for prior HEAD SHA 8d02b647 (Gate 3 FAIL - now remediated)
  • MCP query: query_prod_connector_versions - pre-release 5.15.17-preview.8d02b64 not found in prod DB
❓ How to Respond

Resolving Gate 5 (Pre-Release Validation)

The only remaining inconclusive gate is Gate 5. To resolve it:

Option 1: Wait for live test results
The regression test on stripe_config_dev_null was triggered. Once results are available, re-run /ai-review.

Option 2: Add justification in PR description

## AI PR Review Justification

### Gate 5 (Pre-Release Validation)
[Explain why validation is sufficient - e.g., regression test results, manual testing evidence]

Option 3: Post a comment

AI PR Review Justification:
[Your explanation of testing evidence]

After adding your response, re-run /ai-review to have the bot evaluate it.

Dismissing Prior REQUEST CHANGES

The prior REQUEST CHANGES review from octavia-bot (for Gate 3) can be dismissed by a maintainer since breaking change documentation is now complete.

@sophiecuiy
Copy link
Copy Markdown
Contributor

the live test finished running and all tests passed as seen in the workflow

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Great news! With the live test passing, the fix is validated.

Summary:

  • All CI checks passed (209 tests, 206 passed, 3 skipped)
  • Live testing on stripe_config_dev_null connection passed
  • AI Review: All gates pass except Gate 5 (UNKNOWN due to timing - now resolved with your confirmation)
  • Breaking change documentation complete (v6.0.0, migration guide, scoped metadata)

Next steps:

  1. A maintainer can dismiss the prior REQUEST CHANGES review from octavia-bot (Gate 3 is now remediated)
  2. The PR is ready for human review and merge

Let me know if you need anything else!

@sophiecuiy
Copy link
Copy Markdown
Contributor

add the updated review report

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Updated Review Report

Review Status: Ready for Human Review

Gate Status Details
1. CI/Tests PASS 209 tests (206 passed, 3 skipped)
2. Security PASS No security-sensitive patterns detected
3. Safety/Reversibility PASS Breaking change properly documented (v6.0.0, migration guide, scoped metadata)
4. Operational Risk PASS No pagination, retry, timeout, or rate limit changes
5. Pre-Release Validation PASS Live testing on stripe_config_dev_null completed successfully
6. PR Quality PASS Description present, changelog updated, issues linked

Live Testing Evidence

Connection tested: stripe_config_dev_null (ID: 0f3c8a84-53e2-4a33-89a9-26bf36a2367c)
Workspace: integration-test-sandboxes
Workflow: https://github.com/airbytehq/airbyte-ops-mcp/actions/runs/21725597380
Result: All tests passed

Breaking Change Documentation

  • Version: 5.15.176.0.0 (major version bump)
  • Upgrade deadline: 2026-02-19
  • Scoped impact: invoice_line_items, subscription_items
  • Migration guide: docs/integrations/sources/stripe-migrations.md

Next Steps

  1. Dismiss prior REQUEST CHANGES review from octavia-bot (Gate 3 remediation complete)
  2. Human review and approval
  3. Merge when ready

Requested by sophiecuiy

@sophiecuiy sophiecuiy marked this pull request as ready for review February 6, 2026 17:29
@sophiecuiy sophiecuiy requested a review from a team February 6, 2026 17:29
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 migration guide looks good. A couple of things for you Devin:

  • You should apply the linting suggestions on the docs you've modified.
  • You need to update the main Stripe doc page with a new changelog entry and, if applicable, specifics about the affected streams to ensure their current description is still correct. This is mandatory to pass CI.

@ian-at-airbyte
Copy link
Copy Markdown
Contributor

Ian Alton (ian-at-airbyte) commented Feb 6, 2026

/ai-docs-review

AI Docs Review Started

Analyzing connector changes and preparing documentation recommendations.
View workflow run
AI Docs Review session starting... Analyzing connector changes and preparing documentation recommendations.

Devin AI session created successfully!

…v6.0.0

Co-Authored-By: sophie.cui@airbyte.io <sophie.cui@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Ian Alton (@ian-at-airbyte) I've addressed your feedback:

  1. Linting fix applied: Fixed the extra space in ### Upgrading to 5.6.0### Upgrading to 5.6.0 in the migration guide

  2. Changelog entry added: Added v6.0.0 entry to docs/integrations/sources/stripe.md

  3. Stream descriptions updated: Updated both Invoice Line Items and Subscription Items to include (Incremental) marker since they now support incremental syncs via the events endpoint

Commit: a7fda3a

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Documentation Review

Overall Assessment: The documentation changes are solid. The migration guide is clear, well-structured, and accurately describes the breaking change. The changelog entry and stream sync mode corrections in stripe.md are appropriate. A few completeness improvements are recommended below.

High Priority (Correctness Issues)
  • Issue: The subscription_items incremental stream adds subscription_id and subscription_created parent metadata fields, but the full refresh stream (unchanged by this PR) only adds subscription_updated. This means records will have different fields depending on whether they came from the initial full refresh load or a subsequent incremental sync. The migration guide states unconditionally that subscription_items "Includes subscription_id, subscription_created, and subscription_updated fields," which is only accurate for incrementally-synced records.
    • Evidence: In manifest.yaml, the full refresh subscription_items stream (~line 1590) only has extra_fields: [["updated"]] and a single AddFields transformation for subscription_updated. Compare with the invoice_line_items full refresh stream (~line 1395), which correctly includes extra_fields: [["id"], ["created"], ["updated"]] and adds all three parent metadata fields (invoice_id, invoice_created, invoice_updated).
    • Suggested fix (code): Add subscription_id and subscription_created to the full refresh subscription_items stream's extra_fields and transformations, mirroring the pattern used for invoice_line_items. This ensures schema consistency across sync modes.
    • Suggested fix (docs, if code fix is deferred): Qualify the migration guide statement to note that subscription_id and subscription_created are only present for incrementally-synced records.
Completeness Gaps
  • Missing: The migration guide does not import the reusable MigrationGuide component for generic upgrade steps.

    • Why it matters: Airbyte maintains a shared upgrade guide snippet at @site/static/_migration_guides_upgrade_guide.md that provides standard upgrade instructions applicable to all connectors. Using it avoids duplicating content and ensures the generic steps stay up to date.
    • Suggested addition: Add the following to the end of the 6.0.0 section in stripe-migrations.md:
      import MigrationGuide from '@site/static/_migration_guides_upgrade_guide.md';
      
      ## Connector upgrade guide
      
      <MigrationGuide />
      Note: The import statement should be placed at the top of the file. Existing migration sections (5.6.0, 5.4.0, etc.) also don't use this snippet, so this is a pre-existing gap, but new sections should adopt the convention going forward.
  • Missing: The breakingChanges message in metadata.yaml does not link to the migration guide.

    • Why it matters: The message is shown in-app and sent via email. A direct link helps users find detailed migration steps.
    • Suggested addition: Append to the message: "For detailed migration steps, see the [Stripe migration guide](https://docs.airbyte.com/integrations/sources/stripe-migrations)."
Readability/Organization

Documentation is well-organized and clear. The migration guide follows a logical structure: summary of changes, migration steps with conditional paths for different destination capabilities, and downstream impact. No issues found.

Style Nits

No significant style issues. The linting fixes from reviewdog suggestions appear to have been applied in the latest commit (heading whitespace fix on "Upgrading to 5.6.0", blank line before list).

Summary of Recommended Changes

  1. Fix subscription_items full refresh stream to include subscription_id and subscription_created parent metadata fields, matching the pattern used by invoice_line_items. This ensures schema consistency between full refresh and incremental modes, and makes the migration guide accurate for all sync scenarios.
  2. Add the reusable MigrationGuide component to the 6.0.0 migration section for standardized upgrade instructions.
  3. Add a migration guide link to the breakingChanges message in metadata.yaml so users can find detailed steps from in-app notifications.

This review was generated by Devin. View session

@ian-at-airbyte
Copy link
Copy Markdown
Contributor

aside - sophiecuiy some of the recommendations Devin found in docs review feel like they might be connector issues to me. FYI.

…notes

- Add subscription_id and subscription_created fields to subscription_items full refresh stream for schema consistency
- Add MigrationGuide component import and usage in migration guide
- Add migration guide link to breakingChanges message in metadata.yaml

Co-Authored-By: sophie.cui@airbyte.io <sophie.cui@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Addressed the correctness and completeness notes from the docs review:

Correctness fix:

  • Fixed subscription_items full refresh stream to include subscription_id and subscription_created fields (was only adding subscription_updated). This ensures schema consistency between full refresh and incremental sync modes, matching the pattern used by invoice_line_items.

Completeness fixes:

  1. Added MigrationGuide component import and usage in stripe-migrations.md
  2. Added migration guide link to the breakingChanges message in metadata.yaml

Commit: 77d67ea

The `invoice_line_items` stream now emits individual line item records with IDs starting with `il_` instead of invoice records with IDs starting with `in_`. Similarly, the `subscription_items` stream now emits individual subscription item records with IDs starting with `si_` instead of subscription records with IDs starting with `sub_`.

Each child record includes parent metadata fields for context:
- `invoice_line_items`: Includes `invoice_id`, `invoice_created`, and `invoice_updated` fields
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.

[markdownlint] reported by reviewdog 🐶
MD032/blanks-around-lists Lists should be surrounded by blank lines [Context: "- invoice_line_items: Includ..."]

The `invoice_line_items` stream now emits individual line item records with IDs starting with `il_` instead of invoice records with IDs starting with `in_`. Similarly, the `subscription_items` stream now emits individual subscription item records with IDs starting with `si_` instead of subscription records with IDs starting with `sub_`.

Each child record includes parent metadata fields for context:
- `invoice_line_items`: Includes `invoice_id`, `invoice_created`, and `invoice_updated` fields
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.

[markdownlint-fix] reported by reviewdog 🐶

Suggested change
- `invoice_line_items`: Includes `invoice_id`, `invoice_created`, and `invoice_updated` fields
- `invoice_line_items`: Includes `invoice_id`, `invoice_created`, and `invoice_updated` fields

devin-ai-integration Bot and others added 2 commits February 6, 2026 21:07
The CI check requires the migration guide to start with the header
'# Stripe Migration Guide' as the first line.

Co-Authored-By: sophie.cui@airbyte.io <sophie.cui@airbyte.io>
The 5.6.0 section is not a breaking change, so it should use ### (h3)
instead of ## (h2). The CI check validates that ## headings match
the breakingChanges entries in metadata.yaml.

Co-Authored-By: sophie.cui@airbyte.io <sophie.cui@airbyte.io>
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