---
name: points-transfer-matrix
description: "Use when asked about credit-card transfer partners, transfer ratios, bank points versus airline miles, or cents-per-point (CPP) for an award trip. Run tools/trip_cpp.py against data/transfer_matrix_v0.json instead of inventing a ratio or a value. Chase Ultimate Rewards and Capital One US airline partners only. Do not invent Amex US partner ratios or hotel ratios."
---

# Points transfer matrix + trip CPP

You are reading the MCAFax Travel and Points skill, version v0, as of 2026-11-06. The matrix file and `tools/trip_cpp.py` are the work. This file only decides when to run them. Do the arithmetic in that program. Do not re-derive a ratio or a cents-per-point figure yourself.

Run every command from the folder that contains this SKILL.md. That folder also holds `data/` and `tools/`.

## When this skill triggers

Use this skill when the question is about any of these:

- transfer partners or transfer ratios
- bank points versus airline miles, or partner miles after a transfer
- cents per point, CPP, or what an award trip is worth
- Chase Ultimate Rewards or Capital One miles transfers
- the MCAFax transfer matrix

## Do not

- Invent a partner ratio, an Amex US per-partner ratio, or a hotel ratio. Amex Membership Rewards (US) is in scope and has zero partner rows in v0. Hotels are deferred. Do not quote a hotel ratio from a coverage note. If it is not a row, it is not a ratio to use.
- Treat the matrix as live award inventory, a booking tool, or card advice.
- Claim that other AIs already have this skill installed. An adopter adds this folder by hand.
- Log into a loyalty account, transfer points, or book travel.
- Save the traveler's fares, point balances, or account numbers. The shipped `data/trip_ledger.csv` is a header row only.
- Answer with a number if `tools/trip_cpp.py` did not run. Say that the calculator was not run.

## Run the code

Bank points already known:

```bash
python3 tools/trip_cpp.py --cash-fare <CASH> --taxes <TAXES> --bank-points <BANK_POINTS> --currency USD
```

Partner miles, ratio taken from the matrix:

```bash
python3 tools/trip_cpp.py --cash-fare <CASH> --taxes <TAXES> \
  --partner-miles <MILES> \
  --bank-program chase_ultimate_rewards \
  --partner-program united_mileageplus
```

Capital One to Emirates is 2:1.5 in v0 (60,000 Skywards miles need 80,000 Capital One miles). Pass the program ids and let the program read the row. Do not type the ratio from memory if the file is on disk:

```bash
python3 tools/trip_cpp.py --cash-fare <CASH> --taxes <TAXES> \
  --partner-miles <MILES> \
  --bank-program capital_one_miles \
  --partner-program emirates_skywards
```

The files this skill runs:

- `tools/trip_cpp.py`
- `tools/test_trip_cpp.py`
- `data/transfer_matrix_v0.json`
- `data/transfer_matrix_v0.csv`
- `data/trip_ledger.csv`
- `article/lab-journal-transfer-partner-matrix-v0.md`

Inspect the matrix:

```bash
python3 -c "import json; m=json.load(open('data/transfer_matrix_v0.json')); print(m['as_of'], len(m['rows']), m['coverage']['amex_us']['partner_rows_included'])"
```

Tests, 20 cases, no network:

```bash
cd tools && python3 -m unittest test_trip_cpp.py -v
```

## Formula, implemented in the program

`net_cpp = 100 * (cash_fare - award_taxes_fees - extra_costs) / bank_points_spent`

Bank points are not partner miles when the ratio is not 1:1. The program converts partner miles with `bank_units:partner_units` from the matching row. Require a realistic same-cabin comparable cash fare. An inflated fare inflates CPP. Negative CPP is allowed. Zero or negative bank points are rejected.

If `tools/trip_cpp.py` reports no matrix row, say the pair is not in v0. Do not fill the gap.

## Cite

- The `as_of` date inside `data/transfer_matrix_v0.json`
- The Lab Journal note: https://mcafax.com/notebook/lab-journal-transfer-partner-matrix-v0
- Todd's desk: https://mcafax.com/todd
- The issuer URLs in the matrix JSON `sources` object

## Limits

22 airline rows as of 2026-11-06. Chase Ultimate Rewards: 10 rows, 1:1. Capital One miles (US): 12 rows, including 2:1.5 and 5:3. Amex US partner rows: 0. Not live seat search. Not a paid deal club. Not an award-search service. Ratios change. Confirm the issuer portal before any transfer.
