Skip to content

feat(payments): add optional amount to VoidRequest for partial voids - #229

Merged
armando-rodriguez-cko merged 1 commit into
mainfrom
feat/INT-1689-partial-voids
Aug 27, 2026
Merged

feat(payments): add optional amount to VoidRequest for partial voids#229
armando-rodriguez-cko merged 1 commit into
mainfrom
feat/INT-1689-partial-voids

Conversation

@armando-rodriguez-cko

Copy link
Copy Markdown
Contributor

Summary
Adds the optional amount field to the payment void request, introduced in the API spec on 2026-08-13. When set, only that amount is voided; when omitted, the full payment amount is voided, exactly as before.

Changes

  • Void request model: new optional amount (integer, min 0, max 9999999999) with doc comment
  • Serialization tests: amount present when set, and absent from the body when unset, so existing full-void callers keep sending an identical payload

API Reference

  • POST /payments/{id}/voids (VoidRequest.amount)

Breaking changes
None.

README
No README impact.

@agent-wall-e

agent-wall-e Bot commented Aug 27, 2026

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:Adds a single optional field to an existing request model that maps to an existing endpoint, is non-destructive, introduces no new endpoints, services, auth, persistence, or background processes.

Operational gates

  • ✅ jira_ticket (INT-1689)
  • ✅ independent_review

Files analysed: 2


wall-e 2026.06.19-02 · policy 376219bc71e6…

@agent-wall-e

agent-wall-e Bot commented Aug 27, 2026

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 code Kind Clause Meaning
no_low_class_matched informational §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_modified informational §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_extensionAdds a single optional field to an existing request model that maps to an existing endpoint, is non-destructive, introduces no new endpoints, services, auth, persistence, or background processes. classifying §2.2.6 Sonnet 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-e

agent-wall-e Bot commented Aug 27, 2026

Copy link
Copy Markdown

🟠 Withholding auto-approval — merit review raised concerns.

This PR is in scope for auto-approval (low-risk class, gates passed, checks green), but the merit review flagged the following for a human to confirm before merge:

  • The amount field in VoidRequest is declared as a class-level annotation (amount: int) without a default value or Optional typing, and without being set in an __init__. In Python this is a bare annotation on the class body — it does not create an instance attribute and does not enforce optionality. Whether 'omit when not set' works correctly depends entirely on how JsonSerializer handles missing instance attributes vs. class annotations. The test for the omit-when-not-set case may pass incidentally if the serializer only iterates __dict__ (which won't include a bare annotation), but the class-level annotation with no default could be misleading or break if the serializer also inspects __annotations__. More critically, there is no Optional[int] or = None default, meaning static analysis and any strict serializer may treat the field as required and non-nullable, which contradicts the stated intent of 'optional'. A human reviewer should verify the serializer behavior and fix the type annotation to explicitly reflect optionality (e.g., amount: Optional[int] = None).

A maintainer should review and approve manually if these are acceptable.

wall-e 2026.06.19-02 · merit review · us.anthropic.claude-sonnet-4-6

@armando-rodriguez-cko
armando-rodriguez-cko merged commit 6f3cac9 into main Aug 27, 2026
4 checks passed
@armando-rodriguez-cko
armando-rodriguez-cko deleted the feat/INT-1689-partial-voids branch August 27, 2026 10:34
Sign up for free to 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.

2 participants