Skip to content

Conversation

@nickitza
Copy link
Collaborator

@nickitza nickitza commented Oct 23, 2025

Our SDKs are built off the OAS file in our openapi repository. This file is wildly out of sync with our current "source of truth" v20111101.yaml that lives in docs-v2. To prepare for multi-version handling we need to release the SDKs using the most current v2011 OAS so all missing endpoints and features are reflected and available to clients.

The goal of this ticket is to ensure we have the most current v20111101 OAS file, but DO NOT MERGE this once complete. Instead open this on a feature branch so that an additional step of SDK generation tests can be done before we release and publish.

Acceptance Criteria:

Backup current mx_platform_api.yml

Consolidate content from docs-v2/v20111101.yaml

Copy consolidated content to mx_platform_api.yml

Create PR on feature branch

DO NOT MERGE - wait for https://mxcom.atlassian.net/browse/DEVX-7468 validation

Nicki Nixon added 10 commits October 22, 2025 13:30
Phase 1 of synchronization: Added all missing schemas inline to
mx_platform_api.yml with internal references.

Added schemas:
- ACHResponse, ACHReturnCreateRequest, ACHReturnCreateRequestBody
- ACHReturnResponseBody, ACHReturnsResponseBody
- AllVerifications, AllVerificationsResponse
- InsightUpdateRequestBody
- InvestmentHoldingResponse, InvestmentHoldingResponseBody
- InvestmentHoldingsDeactivation, InvestmentHoldingsResponseBody
- MemberElements, MicrodepositElements
- NotificationResponse, NotificationResponseBody, NotificationsResponseBody
- PaymentAccount, PaymentAccountBody
- PreInitiateMicrodeposit
- ProcessorAccountNumber, ProcessorAccountNumberBody
- ProcessorOwner, ProcessorOwnerBody
- ProcessorTransaction, ProcessorTransactionBody
- RepeatingTransactionResponse, RepeatingTransactionsResponseBody
- RewardElements
- TokenRequestBody, TokenResponse, TokenResponseBody
- TransactionIncludesResponse, TransactionsResponseBodyIncludes
- VCResponse

All external references converted to internal format:
$ref: '#/SchemaName' → $ref: '#/components/schemas/SchemaName'

File changes:
- Before: 9,341 lines (177 schemas)
- After: 10,342 lines (212 schemas)
- Added: 1,002 lines (35 schemas)

Verification:
- Missing schemas: 0 (confirmed via comparison tool)
- YAML valid: passes Redocly preview server
- Internal $ref format: all converted

Tools created for reusability:
- tmp/sync_schemas.rb: Dynamic schema synchronization script
- tmp/compare_openapi_specs.rb: Comparison tool
- tmp/SYNC_SCHEMAS_README.md: Usage documentation

Refs: #DEVX-7466
Phase 2: Add missing fields and remove extra fields to achieve exact parity

Added missing fields (15 total):
- ConnectWidgetRequest: enable_app2app
- InsightResponse: has_associated_categories
- InstitutionResponse: instructional_text_steps, is_disabled_by_client, iso_country_code
- MemberCreateRequest: use_cases
- MemberUpdateRequest: use_cases
- TransactionResponse: is_manual
- TransactionUpdateRequest: date, memo, category_guid
- WidgetRequest: connections_use_case_filter, enable_app2app, iso_country_code, use_cases

Removed extra fields (10 total):
- ImageOptionResponse: guid (removed)
- MemberResponse: error (removed)
- MicrodepositResponse: account_name, account_number, account_type, email, first_name, last_name, routing_number (all removed)
- OptionResponse: guid (removed)

Changes: +77 lines, -33 lines
Script: tmp/sync_fields.rb (reusable for v20250224)

Status after Phase 2:
- Missing schemas: 0 ✅
- Missing fields: 0 ✅
- Extra fields: 0 ✅
- Extra schemas: 9 (Phase 3)
- Missing parameters: 72 (Phase 4)
- Missing paths: 25 (Phase 5)
- Extra paths: 10 (Phase 6)
Phase 3: Parameter Synchronization and Consolidation

This commit implements atomic parameter synchronization between v20111101.yaml
and mx_platform_api.yml, adding missing parameters to the components library
and converting inline parameter definitions to $ref where possible.

Changes:
- Added sync_parameters.rb script with atomic 3-phase operation:
  * Part 1: Add missing parameters to components.parameters
  * Part 2: Remove extra parameters from components.parameters
  * Part 3: Convert inline parameters to $ref (NEW)
- Added SYNC_PARAMETERS_README.md with comprehensive documentation
- Added sync_fields.rb and SYNC_FIELDS_README.md for field synchronization

Phase 3a - Library Creation:
- Added 72 parameters to components.parameters section
- Created section before securitySchemes for proper structure
- Converted external refs to internal format
- Total library size: 519 lines (5201-5719)

Phase 3b - Inline Conversion:
- Converted 352 inline parameter definitions to $ref
- Affected 46 unique parameters across 144 operations
- Net reduction: 1,466 lines (14% file size reduction)
- File size: 10,386 → 8,920 lines
- 11 inline parameters intentionally kept (variant descriptions or extra paths)

Inline Parameters Kept:
- page, records_per_page: Minor description variants
- user_guid, account_guid: Context-specific descriptions
- tax_document_guid: From extra paths (will be removed in Phase 6)

Script Features:
- Atomic operation ensures consistency
- Set-based tracking prevents duplicates
- Precise regex with lookahead prevents tag/response capture
- Comprehensive statistics and error reporting
- Runtime: 5-10 seconds typical

Verification:
- 0 missing parameters (verified via compare_openapi_specs.rb)
- 0 extra parameters (verified via compare_openapi_specs.rb)
- 352 $ref conversions (verified via grep)
- YAML structure validated

Breaking Changes: None

Related: DEVX-7466
Phase 4: Path Synchronization (BREAKING)

This commit synchronizes all API paths between v20111101.yaml and
mx_platform_api.yml using yq to preserve YAML formatting and avoid
unwanted reformatting side effects.

Changes:
- Added sync_paths.rb script using yq for format-preserving YAML manipulation
- Added SYNC_PATHS_README.md with comprehensive documentation
- Added TECHNOLOGY_STACK.md enforcing Ruby-only policy
- Removed compare_openapi_specs.py (Python - violates Ruby-only policy)
- Modified mx_platform_api.yml with path synchronization

Phase 4a - Add Missing Paths (25):
- ACH returns: /ach_returns, /ach_returns/{ach_return_guid}
- Investment holdings (6 paths):
  * /users/{user_guid}/investment_holdings
  * /users/{user_guid}/investment_holdings/{holding_guid}
  * /users/{user_guid}/investment_holdings_deactivate
  * /users/{user_guid}/accounts/{account_guid}/investment_holdings
  * /users/{user_guid}/members/{member_guid}/investment_holdings
- Account operations: /account/account_numbers, /account/check_balance, /account/transactions
- Notifications: /users/{user_guid}/notifications, /users/{user_guid}/notifications/{notification_guid}
- Repeating transactions (2 paths)
- VC endpoints (3 paths)
- Micro deposit verify: /micro_deposits/{micro_deposit_guid}/verify
- Account verifications, tokens, payment accounts
- Transaction insights, spending plan current iteration
- Fixed path: /users/{user_guid}/insights/{insight_guid}

Phase 4b - Remove Extra Paths (10 - BREAKING):
- Holdings endpoints → Investment holdings (4 paths removed)
- Tax documents feature removed entirely (4 paths)
- Path typo fixes:
  * /insights{insight_guid} → /insights/{insight_guid}
  * /microdeposit_guid → /micro_deposit_guid

Technology Improvements:
- Installed yq v4.48.1 (brew install yq)
- Uses yq for YAML manipulation (preserves formatting)
- No quote style changes, no date format changes
- Minimal whitespace cleanup (trailing spaces, array formatting)
- Ruby-only policy enforced (removed Python scripts)

Net Result:
- Path count: 99 → 114 (matches v20111101.yaml)
- File changes: +900 lines, -891 lines (net +9 lines)
- Format preserved: no massive reformatting issues

Breaking Changes:
1. Holdings API renamed to Investment Holdings
   - Update SDK method names and client code
2. Tax documents feature removed (4 endpoints)
   - No longer available in API
3. Path structure fixes may affect hardcoded URLs

Verification:
- 0 missing paths
- 0 extra paths
- 114 paths in perfect sync with v20111101.yaml

Related: DEVX-7466
Replace generic 'mx_platform' tag with 25 domain-specific tags to improve
API documentation organization and user experience in Swagger/Redoc UI.

Changes:
- Update 90 path operation tags from 'mx_platform' to specific domains
- Replace top-level tags definition with all 25 domain tags
- Eliminate generic catch-all tag for better endpoint discoverability

Tag domains added:
- ach return, accounts, budgets, categories, goals
- insights, institutions, investment holdings, managed data
- members, merchants, microdeposits, monthly cash flow profile
- notifications, processor token, rewards, spending plan
- statements, taggings, tags, transaction rules
- transactions, users, verifiable credentials, widgets

Impact:
- Non-breaking: documentation organization only
- Improved navigation: endpoints logically grouped by domain
- Better UX: 25 focused sections instead of 99-item generic list
- Matches v20111101.yaml tag structure

Files changed:
- openapi/mx_platform_api.yml (124 insertions, 100 deletions)
- tmp/sync_tags.rb (Ruby script using yq for format preservation)
- tmp/SYNC_TAGS_README.md (complete phase documentation)
- tmp/PHASES_OVERVIEW.md (project phase tracking)

Phase 5 complete: Tag synchronization successful
Fix 3 schema structures to match models.yaml using Elements composition:
- RewardResponseBody: Use MemberElements + RewardElements (allOf)
- RewardsResponseBody: Use MemberElements + RewardElements (allOf)
- MicrodepositRequestBody: Use MicrodepositElements

Remove 9 deprecated schemas not present in models.yaml:
- HoldingResponse, HoldingResponseBody, HoldingsResponseBody
- MicrodepositRequest
- RewardResponse, RewardsResponse
- TaxDocumentResponse, TaxDocumentResponseBody, TaxDocumentsResponseBody

Impact: 257 lines changed (7 insertions, 250 deletions)
Schema count: 211 → 202 (-9 schemas)

BREAKING CHANGE: Deprecated schemas removed. These were already replaced by newer versions in v20111101.yaml (InvestmentHoldings, Elements patterns).
Fix 3 fields to use number type instead of integer to match models.yaml:
- MicrodepositVerifyRequest.deposit_amount_1: integer → number
- MicrodepositVerifyRequest.deposit_amount_2: integer → number
- MonthlyCashFlowResponse.estimated_goals_contribution: integer → number

Financial amounts and deposit values require decimal precision (cents).

Impact: 3 type changes, minimal breaking risk (number is more permissive than integer)
Convert all external file references to internal component references,
making mx_platform_api.yml completely self-contained and portable.

Changes:
- Converted 33 schema references (25 unique schemas)
- Converted 60 parameter references (25 unique parameters)
- Total: 93 reference conversions
- Pattern: './schemas/models.yaml#/X' → '#/components/schemas/X'
- Pattern: './schemas/parameters.yaml#/X' → '#/components/parameters/X'

Validation:
- Verified all 25 unique schemas exist in components/schemas
- Verified all 25 unique parameters exist in components/parameters
- YAML structure validated post-conversion
- Preview server operational without external dependencies

Cleanup:
- Removed temporary openapi/schemas/ directory
- File is now completely self-contained with no external dependencies

Progress: 8 of 9 phases complete (89%)
Next: Phase 9 - Final Validation

Refs: devx-7466
Add missing delete operation and comprehensive validation script to achieve
100% parity with v20111101.yaml source specification.

Changes:
- Added missing delete operation to /users/{user_guid}/transactions/{transaction_guid}
- Created comprehensive validation script (phase9_final_validation.rb)
- Validates schemas, parameters, paths, operations, types, tags, and structure

Validation Results (100% Pass):
✓ Schema parity: 202/202 schemas match
✓ Parameter parity: 72/72 parameters match
✓ Path parity: 114/114 paths with all operations
✓ Type consistency: All types match models.yaml
✓ No external references (fully self-contained)
✓ Tag synchronization: 25/25 tags properly assigned
✓ File structure: All required sections present

Project Complete:
- 9 of 9 phases complete (100%)
- mx_platform_api.yml fully synchronized with v20111101.yaml
- Specification is production-ready, self-contained, and validated

Refs: devx-7466
@nickitza nickitza added the major Major version update label Oct 23, 2025
Nicki Nixon added 6 commits October 23, 2025 13:45
Fix 6 parameters that were missing required properties causing validation errors:
- userIsDisabled: Added type: boolean, in: query
- topLevelCategoryGuidArray: Added type: array with items, in: query
- topLevelCategoryGuid: Added type: string, in: query
- includes: Added type: string, in: query
- categoryGuidQueryArray: Added type: array with items, in: query
- categoryGuidQuery: Added type: string, in: query

All schema definitions verified against source parameters.yaml file.

Fixes validation errors:
- #/components/parameters/{param}/schema must be object
- #/components/parameters/{param} must have required property 'in'
- #/paths/~1users/get/parameters/4/schema must be object

Refs: devx-7466
Fix "Cannot read properties of null (reading 'swagger')" validation error
by ensuring top-level keys are in the correct order.

OpenAPI specifications must have keys in this order:
1. openapi
2. info
3. servers
4. security
5. tags
6. paths
7. components

The file had all required fields but in wrong order (components was first),
causing validators to fail when reading line-by-line expecting 'openapi' or
'swagger' as the first key.

File now starts with proper header:
  openapi: 3.0.0
  info:
    ...

Refs: devx-7466
Add missing name, example, and required properties to includes parameter
to fix validation error.

Also refactor phase3_sync_parameters.rb to prevent this issue in future runs:
- Changed from regex text extraction to YAML parsing
- Now syncs ALL properties from source (name, description, in, required, example, schema)
- Uses yq commands to add each property individually
- Validates required properties after adding

This ensures parameters are copied completely from parameters.yaml source,
preventing missing property issues that required post-fix patches.

Fixes validation error:
  #/components/parameters/includes must have required property 'name'

Root cause: Original phase3 script used regex that didn't capture all
properties, especially for parameters with multi-line descriptions.

Refs: devx-7466
Update GitHub Actions workflows to reference v20111101.yml instead of
mx_platform_api.yml after file rename for version clarity.

Also fix .gitignore to allow workflow files while blocking AI toolkit:
- Changed from broad .github/* pattern to specific subdirectories
- Now ignores: .github/instructions/*, .github/chatmodes/*, .github/prompts/*
- Allows: .github/workflows/* (CI/CD pipelines)

Files updated:
- .github/workflows/validate.yml
- .github/workflows/version.yml
- .github/workflows/update.yml
- .gitignore

Refs: devx-7466
The OpenAPI file is v20111101.yaml (not .yml), update all workflow
references to use the correct extension.
@nickitza nickitza marked this pull request as draft October 23, 2025 20:33
Nicki Nixon added 7 commits October 23, 2025 15:09
Accidentally replaced workflow logic when only the filename should have
been updated. Restored original structure with tj-actions/changed-files
and mheap/github-action-required-labels actions, only updating filename
from mx_platform_api.yml to v20111101.yaml.
Fix OpenAPI validation errors discovered by Redocly linter:

1. Add bearerAuth security scheme definition
   - Was present in source v20111101.yaml but not synced during phases
   - Required by 4 processor token endpoints

2. Add missing parameters to DELETE /users/{user_guid}/transactions/{transaction_guid}
   - Added transactionGuid and userGuid parameter refs
   - Pre-existing issue from source file

These fixes resolve all 6 critical errors. Spec now validates successfully
with 'npx @redocly/cli lint' (231 warnings remain, non-critical).

Root cause: Phase scripts didn't sync securitySchemes section from source.
Sync missing operationIds from v20111101.yaml to mx_platform_api.yml for
existing path operations that were not updated during Phase 4.

Root cause: Phase 4 only added/removed entire paths but didn't update
properties on paths that already existed in both files. Operations existed
in mx_platform_api.yml before synchronization but lacked operationIds.

Solution: Created fix_missing_operationIds.rb and refactored logic into
phase4_sync_paths.rb as Part 3 to prevent future occurrences.

Validation: Resolved all 21 operation-operationId warnings
- Before: 231 warnings (21 operationId + 210 others)
- After: 210 warnings (pre-existing from source: missing 4xx, descriptions)
Sync 123 operation property updates to achieve parity with v20111101.yaml:

- Add 118 missing parameter references across 54 operations
- Fix 5 response schemas to use TransactionsResponseBodyIncludes

This addresses Phase 4 gaps where existing operations were not fully
synchronized with the source file. Operations now have complete parameter
lists and correct response schema references for enhanced transaction data.

Impact on validation warnings:
- Eliminates 21 "missing operationId" warnings (synced separately)
- Eliminates 15 "unused component" warnings (14 params + 1 schema now used)
- Remaining 3 unused schemas match source (inherited, not introduced)

Refs: DEVX-7466
Add items field to WidgetRequest.iso_country_code to comply with OpenAPI 3.0
specification requirement that array types must define their element types.

This change makes the schema technically valid without affecting documentation
display or user request construction, as the example array already demonstrates
the expected string values ["US", "CA"].
Copy link
Collaborator

@Gvieve Gvieve left a comment

Choose a reason for hiding this comment

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

  1. I do not believe this should be considered a major update and should be a minor. The changes consist primarily of documentation improvements and specification synchronization. The changes add missing optional parameters, and fix schema definitions without introducing breaking changes like removed fields, altered field types, or new required parameters (excluding those that were incorrectly documented but required all along) that would affect existing API integrations.
  2. The version on the mx_platform_api file should match v20111101
  3. I noticed there are 2 tags that are in v20111101.yaml but not in the mx_platformapi.yml - authorization and deprecated. Technically they are unused, but if our goal is a carbon copy of v20111101 should we have those here as well?
  4. Can you please add the backup file as well? We should have it available in the off chance we need to roll back.

@nickitza nickitza added the minor Minor version update label Oct 28, 2025
Update mx_platform_api.yml to match v20111101.yaml source file:
- Change version from 0.1.0 to '20111101' to match source specification
- Add missing deprecated: true flag to deprecatedRequestPaymentProcessorAuthorizationCode operation

These changes ensure the compiled spec is a carbon copy of the source file.
@nickitza nickitza removed the major Major version update label Oct 28, 2025
@nickitza
Copy link
Collaborator Author

@Gvieve Not seeing a way to reply directly... so doing it this way, haha.

  1. I've changed it to minor
  2. the version is now '20111101'
  3. I don't think our goal is a "carbon copy". I think our goal is "functionally identical" - there are enough changes in style/format within the "consolidated single file approach" that we can't call these carbon copies, generally. Putting in unused tags feels like carrying over unnecessary clutter that could lead to confusion more than it's going to help anything.
  4. Back up file addded with comment to let users know why/what it is.

Thanks for your feedback! Let me know if you have any other thoughts!
🙏

@Gvieve
Copy link
Collaborator

Gvieve commented Oct 29, 2025

@Gvieve Not seeing a way to reply directly... so doing it this way, haha.

  1. I don't think our goal is a "carbon copy". I think our goal is "functionally identical" - there are enough changes in style/format within the "consolidated single file approach" that we can't call these carbon copies, generally. Putting in unused tags feels like carrying over unnecessary clutter that could lead to confusion more than it's going to help anything.

@nickitza Thanks for making those changes! P.S. To reply to a general comments you can use "quote reply" in the ellipses.

I appreciate your perspective on "functionally identical" vs "carbon copy," and I understand the concern about unnecessary clutter. However, I'd like to clarify our approach here.

The v20111101.yaml file in docs-v2 is our single source of truth. While I agree that some stylistic differences are inevitable in the consolidation process, we want to maintain as much consistency as possible, especially for structural elements.

Here's why including all tags (even unused ones) is important:

  • Consistency maintenance: When the next person works on copying/syncing from v20111101, they'll see the complete picture rather than having to figure out what was intentionally excluded vs accidentally missed.
  • Future automation: We're moving toward a more automated sync process, which means they'd come over with automation anyhow.
  • Source of truth principle: Any decisions about what to include/exclude should ideally be made in the source file (v20111101.yaml) and then flow downstream, rather than being made during the copying process.

Would you be willing to add those two missing tags for now? If there's a strong case for removing unused tags entirely, we can always make that change in the source file and then let it flow through to all its spawns 👹 😄 .

@nickitza
Copy link
Collaborator Author

@Gvieve Got it! Those have been added back in.

Copy link
Collaborator

@Gvieve Gvieve left a comment

Choose a reason for hiding this comment

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

Thanks for making all those changes!

Nicki Nixon and others added 2 commits November 5, 2025 12:48
* Add SDK generation validation workflow

- Implements dry-run testing for all 6 SDK languages (Java, Ruby, Python, JavaScript, C#, Go)
- Validates OpenAPI spec can generate SDKs without publishing
- Runs on PR changes to mx_platform_api.yml only
- Includes comprehensive file structure validation and basic syntax checking
- Provides clear pass/fail status with error reporting
- Temporary files cleaned up after validation

Addresses Phase 0 AC for SDK generation pre-checks

* downgrade versions to v3 to match existing usages in sdks

* remove intensive full project validation and replae with failing if source files don't exist

* on: pull_request, remove path

* fix javascript references to be node and point to typescript-axios generator

* paths array

* restore matrix.generator

* Add simple test workflow to debug trigger

* Remove paths filter to test workflow trigger

* Remove test workflow and fix main SDK validation workflow trigger

* test removing setup

* trigger test

* remove test comment

* test comment to test trigger

* remove java@v3 setup

* silence file logs, stop after finding 1

* quit after finding 1

* remove comments

---------

Co-authored-by: Nicki Nixon <nicki.nixon@mx.com>
@nickitza nickitza marked this pull request as ready for review November 5, 2025 20:42
@nickitza nickitza merged commit bc30ed4 into master Nov 5, 2025
10 checks passed
@nickitza nickitza deleted the nn/devx-7466_phase0 branch November 5, 2025 20:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

minor Minor version update

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants