Skip to content

feat(accounts): add the ISV payout schedule fields and funds_transfer_type on payouts - #653

Open
armando-rodriguez-cko wants to merge 2 commits into
masterfrom
feat/INT-1684-isv-payout-schedules-links-platforms-instrument
Open

feat(accounts): add the ISV payout schedule fields and funds_transfer_type on payouts#653
armando-rodriguez-cko wants to merge 2 commits into
masterfrom
feat/INT-1684-isv-payout-schedules-links-platforms-instrument

Conversation

@armando-rodriguez-cko

Copy link
Copy Markdown
Contributor

What

Two additions from the 2026-08-05 spec, verified against the spec and against the code before writing anything.

A. SaaS seller (ISV) payout schedules

GET/PUT /accounts/entities/{id}/payout-schedules gained an anyOf with a SaaS seller variant. On the wire that is two fields, balance_minimum and carry_forward_enabled, on both the request and the response. They were missing in all seven SDKs.

payment_instrument_id is also added: it was absent from both sides of this schedule, though it is not new in the spec.

B. instruction.funds_transfer_type on the card payout response

The field already existed on the payout request. This is the response side, where the instruction carried only value_date.

Tests

The ones that matter here are the negative cases, because getting them wrong is silent:

  • A standard sub-entity has no balance minimum and no carry-forward, so neither may appear in its request body. If they leaked in as null or 0, the API would read a standard schedule as an ISV one.
  • Absent from a response, they must come back null rather than 0/false, so a caller can tell "not applicable" from "set to zero".

Not breaking

Purely additive.

Refs INT-1684.

…_type on payouts
From the 2026-08-05 spec. Verified against it with the RAG rather than the ticket
text, which turned out to overstate the work.
The ISV part is not five new schemas. The payout schedule endpoint gained an anyOf
with a SaaS seller variant, and what that variant actually adds on the wire is two
fields: balance_minimum, the amount to retain in the sub-entity's available balance,
and carry_forward_enabled, whether a balance below the minimum rolls into the next
payout. Both go on the request and the response.
The ScheduleFrequency*Isv schemas serialise identically to the ones already here:
same by_day array, same by_month_day array. Only the accepted values differ, and
the API enforces them. Adding parallel classes with identical wire shapes would have
doubled the public surface for nothing, so the constraints are documented on the
existing classes instead: working days only for ISV weekly and daily, and only
[1], [15], [1,15] or [1,16] for ISV monthly.
The card payout side is one field, and the ticket points at the wrong half:
funds_transfer_type already existed on the payout REQUEST via PaymentInstruction.
What was missing is the response, where PaymentInstructionResponse carried only
value_date.
Two of the four tests cover absence rather than presence. A standard schedule must
not emit balance_minimum or carry_forward_enabled at all, since either leaking in as
a null or a zero would make the API read it as an ISV schedule, and both must come
back null rather than 0/false so a caller can tell "not applicable" from "set to
zero".
Blocks C and D of the ticket need no work in Java: the hosted payment and payment
link responses extend Resource, which already maps _links, and
PaymentInstrumentRequest already has label, currency and instrumentDetails.
Refs INT-1684.
The field that says where a sub-entity's payout actually goes was missing from both
the request and the response, in all seven SDKs, and it never appeared in the swagger
changelog, so it predates the point where changes started being tracked. Found while
implementing the ISV fields in the same two classes.
Riding along in INT-1684 rather than getting its own row: it is one property, and
tracking a ticket per property costs more than it returns. Called out here and in the
PR so it is not invisible.
The doc comment carries the bit that is easy to get wrong: for SaaS sellers it is
optional, but when supplied it must reference a verified payment instrument or the API
rejects the request.
The existing four tests were extended rather than new ones added, including the two
that assert absence, since a payout destination leaking into a standard schedule
request is the same class of bug as the ISV fields leaking in.
Refs INT-1684.
@agent-wall-e

Copy link
Copy Markdown

🟢 Risk Classification: LOW

Approval route: AI Auto-Approval
Rollback controls: Automated Instant Rollback + feature flags

Classification reasons

  • no_low_class_matched
  • prod_source_modified
  • 2.2.6_logical_extension:Purely additive new fields on existing request/response POJOs within existing endpoints, no new endpoints, services, auth changes, persisted data, or external integrations introduced.

Operational gates

  • ✅ jira_ticket (INT-1684)
  • ✅ independent_review

Files analysed: 8


wall-e 2026.06.19-02 · policy 376219bc71e6…

@agent-wall-e

Copy link
Copy Markdown
🔬 Debug — why this classification?

Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.

Reason codeKindClauseMeaning
no_low_class_matchedinformational§2.2 (fall-through)None of the deterministic Low classes (§2.2.3, §2.2.4, §2.2.7, docs-only) applied; classifier fell through to LLM evaluation.
prod_source_modifiedinformational§2.1 M7 (informational)At least one file is non-doc, non-test, non-IaC — i.e. application source code was modified.
2.2.6_logical_extensionPurely additive new fields on existing request/response POJOs within existing endpoints, no new endpoints, services, auth changes, persisted data, or external integrations introduced.classifying§2.2.6Sonnet 4.6 evaluator promoted minor → low: the change reuses existing code paths and does not cross a trust boundary.

Kinds:

  • classifying — this rule contributed to the chosen tier.
  • informational — context only; did not by itself decide the tier.

See issue #3 for the proposal to formalise this map as Appendix A of the standards doc.

wall-e 2026.06.19-02 · debug

@sonarqubecloud

Copy link
Copy Markdown

@agent-wall-eagent-wall-eBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Auto-approved — this PR meets all Low-risk criteria.

All checks passed, no unresolved comments, and the change classification is:

  • no_low_class_matched
  • prod_source_modified
  • 2.2.6_logical_extension:The change is purely additive, adding new optional fields to existing request/response POJOs on already-existing endpoints without introducing new endpoints, services, persisted data, auth changes, or external integrations.

wall-e 2026.06.19-02 · policy 376219bc71e6…

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

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@armando-rodriguez-cko