Skip to content

chore: sync uv.lock to the 2.7.0 self-version - #118

Merged
vvillait88 merged 1 commit into
mainfrom
lock-2-7-0
Aug 18, 2026
Merged

chore: sync uv.lock to the 2.7.0 self-version#118
vvillait88 merged 1 commit into
mainfrom
lock-2-7-0

Conversation

@vvillait88

Copy link
Copy Markdown
Contributor

Summary

The 2.7.0 release bumped pyproject.toml without regenerating uv.lock, so uv rewrites the editable self-entry (2.6.0 to 2.7.0) on the next sync and leaves every checkout dirty. One-line lock sync; no dependency changes. Worked with Varun (workspace sync surfaced it).

Type of change

  • Bug fix (no breaking change)
  • New feature (no breaking change)
  • Breaking change (existing callers must update)
  • Docs, tests, or internal maintenance only

Public API

None.

Test plan

Lockfile-only; the diff is the self-version line. CI is the gate.

Checklist

  • Tests cover the new behavior, and the suite passes locally
  • Lint, format, and type checks pass
  • Docs and README examples updated if the public surface changed
  • No secrets, credentials, or personal data in the diff or the tests

The 2.7.0 release bumped pyproject.toml without regenerating the lock;
uv rewrites the editable self-entry on the next sync, which left every
checkout dirty.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vvillait88
vvillait88 merged commit 4409b1c into main Aug 18, 2026
7 checks passed
@vvillait88
vvillait88 deleted the lock-2-7-0 branch August 18, 2026 21:31
vvillait88 added a commit that referenced this pull request Aug 28, 2026
## Summary

Both wallet-OFAC paths branched on `if decision == "deny"`, so
everything that was not literally the string `"deny"` was permitted **by
structure**: `None` from an unreadable response, and any decision value
the API adds later. Both paths already deny on an API outage and
describe themselves as strict-liability, so letting an unreadable answer
through contradicted their own posture. On the compute-first path it
would have settled the payment.

Sites: `agentscore_commerce/checkout.py` (`_run_wallet_sanctions_only`)
and `agentscore_commerce/checkout_compute_first.py`.

Both now deny unless the decision is exactly `"allow"`. A missing or
null decision is an unreadable response rather than a verdict about the
buyer, so it maps to `api_error`, matching how an outage is already
reported on these paths; a decision that is present but not an approval
keeps `wallet_not_trusted`.

Found by the Q3 2026 penetration test, worked with Varun. The
node-commerce half is PR #118 there, and the API half has already landed
in core.

## Type of change

- [x] Bug fix (no breaking change)
- [ ] New feature (no breaking change)
- [ ] Breaking change (existing callers must update)
- [ ] Docs, tests, or internal maintenance only

No exported surface changes. The only behavior difference is that a
response which could not be read as an approval is now refused; a
merchant relying on that was relying on the defect.

## Public API

None. No signature, model or response shape changes.

Behavior changes for two response shapes that should not occur against a
current API: an assess response with no `decision`, and one carrying an
unrecognised decision value. Both now deny where they previously
allowed, returning `api_error` and `wallet_not_trusted` respectively.

## Test plan

`uv run ruff check`, `uv run ruff format --check` and `uv run ty check`
all clean. `uv run pytest`: **1868 passed**, 4 skipped, coverage 95.37%
(above the 95% gate).

Five new tests across the two paths: missing `decision`, explicit null
`decision`, and an unrecognised decision value, asserting on both the
denial code and, for compute-first, that `verify_payment` was never
called so no settle occurred.

Both guards were drilled rather than assumed: restoring the original
`decision == "deny"` check in both files fails 5 of the new tests, and
every one passes again once reverted.

Deliberately **not** added: a `policy_result` check. Neither path sends
a merchant policy, so requiring one would deny every call, since
`policy_result` is correctly null when no policy was submitted. That
half of the finding lives in the node gate, which does send policies.

## Checklist

- [x] Tests cover the new behavior, and the suite passes locally
- [x] Lint, format, and type checks pass
- [x] Docs and README examples updated if the public surface changed
- [x] No secrets, credentials, or personal data in the diff or the tests
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant