Transfer BonusesCAUTION
AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.
Overview
AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.
fda58ab480fdOBSERVED · 2026-10-14What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
---
name: transfer-bonuses
description: Active credit card transfer bonuses from Amex, Chase, Capital One, Citi, Bilt, and Rove. Weekly-refreshed data with confidence markers. Use when pricing an award booking that involves a points transfer or deciding whether to wait for a better bonus.
category: reference
summary: Active credit card transfer bonuses with primary-source citations. Tells the agent the real effective ratio when transferring points during a promotion.
---
# Transfer Bonuses Skill
Authoritative reference for current credit card transfer bonuses. Reads from `data/transfer-bonuses.json`, which is refreshed weekly by `scripts/refresh-transfer-bonuses.py` (run automatically every Monday via `.github/workflows/refresh-data.yml`, and manually any time). The script scrapes Frequent Miler (canonical) and cross-checks each bonus against AwardWallet. Each active bonus carries a confidence marker (`VERIFIED` if both FM and AwardWallet agree, `LIKELY` if only FM, `UNVERIFIED` if single weak source) per the toolkit's Research Integrity Protocol. TPG is sometimes consulted manually as a sanity check but is NOT scraped programmatically — TPG often shows expired bonuses as active.
## The Expiry Gate (run this BEFORE citing any bonus)
The data file is a snapshot; bonuses commonly end on month-end dates between refreshes. On 2026-07-07 the file listed 7 "active" bonuses of which 5 had ended a week earlier — an agent quoting the file raw would have priced a Chase→Marriott transfer at 1.55x when the real ratio was 1.0. So, mechanically, every time:
1. Get today's date.
2. For each bonus you're about to cite, compare `end_date_inclusive` to today. **Past-dated = expired, regardless of which array it sits in.** Never present an expired bonus as available.
3. If any `active_bonuses` entry is past-dated, or `_meta.last_updated` is more than 7 days old, refresh first: `python3 scripts/refresh-transfer-bonuses.py` (use `--dry-run` to preview). Then re-read the file.
4. If the refresh fails (source layout changed, offline), present the bonus WITH its end date and staleness caveat: "the file shows +30% through 2026-07-14, last verified <date> — confirm on the issuer's transfer page before moving points."
## When to Use
- **Pricing an award booking that involves a transfer.** A 30% bonus to JAL changes the real cost of a oneworld booking through JAL by 23%. The math has to factor in the bonus.
- **Deciding whether to transfer now or wait.** If a bonus is expected to recur (see `frequent_recurring_bonuses_to_watch`), it may be worth waiting.
- **Sanity-checking whether a "good bonus" actually wins.** Hotel bonuses especially (Chase UR to IHG 70%, Chase UR to Marriott 50-70%) often look great in headlines but lose to the Chase Travel portal (dynamic Points Boost on CSR/CSP, ~1.5-2.0 cpp on select bookings; not a guaranteed floor). Always pull the actual portal quote and run the math against it, not against an assumed rate.
- **Identifying stackable bonuses.** Aeroplan Visa cardholders stack a 10% cardholder bonus on top of any Chase UR to Aeroplan promotion.
## When NOT to Use
- Transfer ratios in general (without an active bonus). Use [transfer-partners](../transfer-partners/SKILL.md) for the standard ratios.
- Points valuations (cpp by program). Use [points-valuations](../points-valuations/SKILL.md).
- Award flight availability. Use [seats-aero](../seats-aero/SKILL.md).
- Booking guidance and the hold-before-transfer rule. Use [booking-guidance](../booking-guidance/SKILL.md).
## Data File
`data/transfer-bonuses.json`. Schema (relevant fields):
| Field | Description |
|-------|-------------|
| `_meta.last_updated` | ISO date, last refresh |
| `_meta.staleness_days` | TTL in days; integrated with `scripts/check-data-freshness.sh` |
| `_meta.primary_sources` | Frequent Miler, AwardWallet (TPG consulted manually only) |
| `active_bonuses[].bonus_pct` | The bonus percentage (e.g., 30 for 30%) |
| `active_bonuses[].ratio` | Multiplier on standard ratio (1.30 = 30% bonus) |
| `active_bonuses[].standard_ratio` | Baseline transfer ratio (1.0 = 1:1, 0.75 = 4:3) |
| `active_bonuses[].effective_ratio` | Final ratio after bonus (`standard_ratio * ratio`) |
| `active_bonuses[].end_date_inclusive` | Last day the bonus is active |
| `active_bonuses[].confidence` | VERIFIED, LIKELY, or UNVERIFIED |
| `active_bonuses[].sources[]` | Direct URLs to primary source posts |
| `active_bonuses[].notes` | Strategic context, including "but you shouldn't" warnings |
| `expired_recently[]` | Bonuses that ended in the last 30 days. Useful for noticing TPG/AW staleness. |
| `frequent_recurring_bonuses_to_watch{}` | Bonuses that historically recur, with typical % and frequency. Use for "should I wait?" decisions. |
| `decision_rules{}` | Six concrete rules for how to factor bonuses into a transfer decision. |
## Refreshing the Data
Run weekly (or on-demand) via:
```bash
python3 scripts/refresh-transfer-bonuses.py
```
The script:
1. Scrapes Frequent Miler's current point transfer bonuses page (canonical source).
2. Cross-checks each bonus against AwardWallet.
3. Sets confidence based on cross-check results: VERIFIED if 2+ sources agree, LIKELY if only Frequent Miler.
4. Moves expired bonuses to `expired_recently[]`.
5. Updates `_meta.last_updated`.
`scripts/check-data-freshness.sh` flags this file as stale after 7 days.
If the script fails (Frequent Miler's HTML changed, network issue, etc.), fall back to manual update by visiting the two primary sources (Frequent Miler, AwardWallet) and editing the JSON by hand. TPG can be consulted as a sanity check but is not authoritative because it frequently shows expired bonuses as active. **NEVER fabricate a bonus**. Per the Research Integrity Protocol, if you cannot verify a bonus from a primary source, do not include it.
## Quick Reference Output Format
When the user asks "what bonuses are active right now?", read `data/transfer-bonuses.json` and produce a markdown tablTrust audit
CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | WARN |
| L1 | Static analysis of the code | NA |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (5)
.agents/skills
.claude/skills
.opencode/skills
skills
AGENTS.md
Gates applied: no_behavioural_pass.
fda58ab480fdfull audit observations/trust-audit/skill/borski__transfer-bonuses.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-14 | fda58ab480fd | CAUTION | B | 89 | first audit |
Questions
What does the Transfer Bonuses skill do?
AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode.
Is Transfer Bonuses safe to install?
With care. The audit graded it B (89/100) and found 5 things worth knowing before you trust this skill, listed below with the exact line each was found on.
What can Transfer Bonuses access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
How current is this page?
The grade is for one exact copy of the source (fda58ab480fd), read on 2026-10-14. The repository is watched, and a new audit runs when it changes — this is the first audit.