Skip to content

[Agricola] AGR-2026-022: Challenge selection ignores the offered intent #97

Description

@github-actions

AGR-2026-022 — Challenge selection ignores the offered intent

Last observed by the head-to-head audit at 2026-08-08T19:52:20.848585Z.

Audited heads

Target Repository Commit Conformance Semantic review
typescript wevm/mppx b7ab48e38e3d Complete Reference
python tempoxyz/pympp 7f7164afa55c Complete Complete
go tempoxyz/mpp-go 9cad840de723 Complete Complete
java stripe/mpp-java 8e403af5291e Complete Complete
ruby stripe/mpp-rb 58a98bbf6820 Complete Complete
rust tempoxyz/mpp-rs 9808dede7ad8 Complete Complete

Finding

  • Fingerprint: semantic:challenge-negotiation/select-supported-method-intent
  • Source: semantic
  • Affected SDKs: python
  • Clean SDKs: go, java, ruby, rust
  • Canonical reference: draft-httpauth-payment-00 § Client Payment Preferences; § Multiple Payment Options
  • Likely origin: likely SDK-local divergence
  • Severity: medium
  • Confidence: high

Evidence

SDK Canonical evidence SDK evidence Suggested test
python selectChallengeCandidates — Indexes configured capabilities by the canonical method/intent key and only produces candidates whose complete key matches the challenge. PaymentRuntime.match_challenge — Returns the first challenge whose method name exists in _methods; it never checks the challenge intent. Configure a charge-only Tempo client and return two Tempo challenges ordered as session then charge; assert the charge challenge is selected and paid.

python: The canonical client matches challenges against both payment method and intent. The target indexes clients only by method name and selects the first challenge with that method, even if its intent is unsupported. An unsupported first offer can therefore raise during credential creation and prevent use of a later compatible challenge.

Available /ag commands

Post a command as a new comment. Only configured maintainers can run these commands.

Target Automation Status Pull request
python pr Recorded tempoxyz/pympp#212

Quick action

Use GitHub's copy button, then post this command as a comment:

/ag fix
Command What it does
/ag fix Opens or retries draft fixes for every affected PR-enabled SDK.
/ag fix python Opens or retries the draft fix for python only.
/ag fix "instruction" Applies the instruction to affected fixes; recorded PRs also incorporate unresolved review feedback and failed CI.
/ag status Reports the current state of linked remediation pull requests.

Metadata

Metadata

Assignees

No one assigned

    Labels

    python:uvPull requests that update python:uv code

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions