---
title: Close the double-veto race and validate the commissioner trade veto end to end
type: task
status: planned
description: >-
  Add the missing vetoed guard to the veto route's conditional update with a red-first spec, then
  run one operator-approved real veto to verify reversal, refusals and UI.
base_uri: user:task/league/harden-and-validate-commissioner-trade-veto.md
created_at: '2026-09-30T05:59:30.828Z'
entity_id: 8eced8ef-d867-439c-96b6-4a888da249b5
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-09-30T05:59:30.828Z'
visibility_analyzed_at: '2026-11-05T23:49:35.290Z'
---

# Close the double-veto race and validate the commissioner trade veto end to end

The veto route in `api/routes/leagues/trade.mjs` guards `approved` but not `vetoed` on its conditional update (around line 1700 on 2026-09-30), so two close vetoes both commit the reversal. The veto action itself has never run against a live league.

## Plan

- [ ] Add `.whereNull('vetoed')` to the veto update, split the zero-row refusal message, and add a double-veto spec proven red first — [[████████████████████████-██-██████████████-████-█████-███████-██████-███████]]
- [ ] With operator approval, exercise a real veto on a vetoable trade (live one, or an agreed test trade) and verify reversal, refusals and UI — [[████████████████████████-██-█████████████████-█████-████-███████-████-█████████]]

## Notes

The veto POST is destructive. The end-to-end step needs the operator to re-auth the `league-prod` profile and approve the specific trade. Deploy is human-gated.
