Agent Challenges
ruvnet/ruflo
Agent skill for challenges - invoke with $agent-challenges. An agent skill from ruvnet/ruflo.
Status match and status challenge rules for airlines and hotels.
$ npx skills add borski/travel-hacking-toolkit --skill status-match -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install borski/travel-hacking-toolkit status-match --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/borski/travel-hacking-toolkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/travel-hacking-toolkit/skills/status-match .claude/skills/status-match && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "status-match" agent skill from https://github.com/borski/travel-hacking-toolkit/tree/main/plugins/travel-hacking-toolkit/skills/status-match into .claude/skills/status-match/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "status-match", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/borski/travel-hacking-toolkit/tree/main/plugins/travel-hacking-toolkit/skills/status-matchType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add borski/travel-hacking-toolkit --skill status-match -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install borski/travel-hacking-toolkit status-match --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/borski/travel-hacking-toolkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/travel-hacking-toolkit/skills/status-match .agents/skills/status-match && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "status-match" agent skill from https://github.com/borski/travel-hacking-toolkit/tree/main/plugins/travel-hacking-toolkit/skills/status-match into .agents/skills/status-match/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "status-match", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add borski/travel-hacking-toolkit --skill status-match -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install borski/travel-hacking-toolkit status-match --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/borski/travel-hacking-toolkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/travel-hacking-toolkit/skills/status-match .cursor/skills/status-match && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "status-match" agent skill from https://github.com/borski/travel-hacking-toolkit/tree/main/plugins/travel-hacking-toolkit/skills/status-match into .cursor/skills/status-match/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "status-match", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/borski/travel-hacking-toolkit.git --path plugins/travel-hacking-toolkit/skills/status-match--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add borski/travel-hacking-toolkit --skill status-match -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install borski/travel-hacking-toolkit status-match --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/borski/travel-hacking-toolkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/travel-hacking-toolkit/skills/status-match .gemini/skills/status-match && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "status-match" agent skill from https://github.com/borski/travel-hacking-toolkit/tree/main/plugins/travel-hacking-toolkit/skills/status-match into .gemini/skills/status-match/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "status-match", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install borski/travel-hacking-toolkit status-matchInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add borski/travel-hacking-toolkit --skill status-match -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/borski/travel-hacking-toolkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/travel-hacking-toolkit/skills/status-match .github/skills/status-match && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "status-match" agent skill from https://github.com/borski/travel-hacking-toolkit/tree/main/plugins/travel-hacking-toolkit/skills/status-match into .github/skills/status-match/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "status-match", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add borski/travel-hacking-toolkit --skill status-match -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install borski/travel-hacking-toolkit status-match --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/borski/travel-hacking-toolkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/travel-hacking-toolkit/skills/status-match .opencode/skills/status-match && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "status-match" agent skill from https://github.com/borski/travel-hacking-toolkit/tree/main/plugins/travel-hacking-toolkit/skills/status-match into .opencode/skills/status-match/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "status-match", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
status-matchStatus match and status challenge rules for airlines and hotels.
Status Match is an agent skill from borski/travel-hacking-toolkit. Status match and status challenge rules for airlines and hotels. Covers free direct matches, paid concierge via statusmatch.com with fees, card-granted status, and critical lifetime/once-per-N-years restrictions that make wasted matches expensive.
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: AI-powered travel hacking and search with cash, points, miles, and award flights. Drop-in skills and MCP servers for Claude, Codex, and OpenCode. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit db82131. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
Bash(jq *)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
statusmatcher.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Status Match loads about 3.6k tokens when it runs. Until then it costs about 65 tokens; SKILL.md has 1,656 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from borski/travel-hacking-toolkit at commit db82131, republished under its MIT licence (© borski). 1,656 words, ~3,553 tokens.
.claude/skills/status-match/SKILL.md (or your agent's skills folder).When a user wants to switch loyalty programs or shortcut to elite status, the question is rarely "can I match?" but "should I match?" The answer depends on three things this skill makes explicit: how often the program lets you do it, what it costs (free vs paid concierge), and whether a credit card already grants the tier you want.
Reference data: data/status-match.json. Refresh cadence is 90 days because rules change occasionally but not weekly.
Many of the best status matches are once-per-lifetime or once-every-3-years. A match wasted in the wrong year because the user doesn't have travel coming up is gone forever. Always read the lifetime_warning field before recommending an application.
The biggest offenders:
| Program | Restriction |
|---|---|
| Alaska Atmos Rewards | ONCE PER LIFETIME (literally; from terms: "one status match for the lifetime of their account") |
| Flying Blue (paid concierge) | ONCE PER LIFETIME ("Only 1 match is allowed per person") |
| United MileagePlus | ONCE EVERY 3 YEARS (failed challenge can extend lockout to 5 years) |
| Delta SkyMiles | ONCE EVERY 3 YEARS (per official terms) |
| AA AAdvantage Instant Status Pass | ONCE EVERY 2 YEARS |
| Hyatt Globalist Challenge | LIKELY once per lifetime (community-confirmed; not in published terms; Hyatt has discretion) |
| Marriott Platinum Challenge | LIKELY once per lifetime when offered (targeted; not always available; opt-in only) |
| Hilton Diamond Challenge | LIKELY once per lifetime (when offered; Gold via Amex Platinum is renewable separately and not subject to the lifetime restriction) |
When the user is considering a match, the first question to answer is "do you have travel that uses this status in the next 6-12 months?" If no, don't burn the match. Card-based renewable status is the better fallback (see below).
booking-guidance)points-valuations)seats-aero, compare-flights)The destination program offers the match for free, no third party. Best path when available.
| Program | Restriction | Initial | Challenge |
|---|---|---|---|
| AA AAdvantage | Once every 2 years | Trial | Yes (Loyalty Points) |
| United MileagePlus | Once every 3 years | 120 days | Yes (PQF + PQP) |
| Delta SkyMiles | Once every 3 years | 90 days | Yes (MQDs) |
| Alaska Atmos | Once per lifetime (verified primary) | 90 days | Yes (base points) |
| Hyatt Globalist Challenge | LIKELY once per lifetime (community-confirmed; Hyatt discretion) | varies | Yes (paid nights) |
| Marriott Platinum Challenge | LIKELY once per lifetime when offered (targeted) | varies | Yes (paid nights) |
| Hilton Diamond Challenge | LIKELY once per lifetime (when offered) | varies | Yes (paid nights) |
| IHG One Rewards | Varies by promo | varies | Sometimes |
For full details, see direct_matches section of data/status-match.json.
A third-party service (Loyalty Status Co) operates statusmatch.com and partners with specific airlines and hotels. They process your application for a fee. The matches are real. The trade-off is cash-for-status — only worth it if the perks for your travel exceed the fee.
| Program | US Fee Range (approx) | Lifetime Restriction |
|---|---|---|
| Flying Blue (Air France/KLM) | USD $99-$199 | Once per lifetime |
| Lufthansa Miles & More | EUR €99 (free for HON Circle, Club Plus, Club Premium) | Once per promotion |
| Etihad Guest | Region-tiered, varies | Once per promotion |
| Air Canada Aeroplan | varies; Aeroplan Visa cardholders may be discounted | Once per promotion |
| Frontier | varies | Per promotion |
| Spirit Free Spirit | varies | Per promotion |
| Emirates Skywards | varies | Per promotion |
| Vietnam Airlines, Royal Jordanian, Air Astana, Star Alliance multi (Singapore, Swiss, Thai, TAP, Turkish, etc.) | varies | Per promotion |
| citizenM, GHA Discovery (hotels) | varies | Per promotion |
Always check the destination subdomain's FAQ for current fees (e.g., flyingblue.statusmatch.com/faq). Fees vary by source country and target tier.
For full details, see paid_concierge section of data/status-match.json.
For mid-tier hotel status (Gold) and a few other tiers, holding a credit card grants the status automatically. This is renewable for the life of the card — no lifetime restriction, no challenge to complete.
| Card | Annual Fee | Status Granted |
|---|---|---|
| Amex Platinum / Business Platinum | $895 (was $695, increased Jan 2 2026) | Hilton Gold + Marriott Gold |
| Hilton Aspire | $550 | Hilton Diamond |
| Hilton Surpass | $150 | Hilton Gold (Diamond requires $40K spend) |
| World of Hyatt Card (Chase) | $95 | Hyatt Discoverist |
| Marriott Bonvoy Brilliant (Amex) | $650 | Marriott Platinum Elite |
| IHG One Rewards Premier (Chase) | $99 | IHG Platinum Elite |
Note on Amex Platinum / Business Platinum: Annual fee increased from $695 to $895 effective January 2, 2026 (announced September 2025). Existing cardholders had their renewal cycles affected after that date. The card still grants Hilton Gold + Marriott Gold automatically — those benefits themselves are free, but the AF is the cost of access.
Decision rule: if a credit card grants the tier you want and you'd hold the card anyway for other benefits, that beats a one-time match every time. Status match is best for tiers no card grants (most airline tiers; hotel Diamond/Titanium without spend gating).
For full details, see card_based_status section of data/status-match.json.
Ask if not already clear:
Query card_based_status in data/status-match.json. If a card already grants the equivalent tier and the user holds (or would hold) that card, recommend that path. No status match needed.
If no card grants it, query direct_matches.airlines or direct_matches.hotels for the destination program. Pull the lifetime restriction and challenge requirements.
Critical: explicitly tell the user the lifetime restriction. Example:
"Alaska Atmos status match is once per lifetime. Their terms quote: 'one status match for the lifetime of their account.' If you don't have flying coming up that uses this status before Q4, hold off. Once you submit, you can never do this again."
Query paid_concierge.programs. Pull the fee for the user's region and the lifetime restriction.
Compute whether the fee is worth it:
fee_in_usd = ... (from data file)
status_value_per_year = (lounge access cash value) + (free bag fees saved on N flights) + (upgrade probability * upgrade value) + (better redemption visibility)
break_even_years = fee_in_usd / status_value_per_yearIf break-even is under 1 year of typical travel, recommend. If over 2-3 years (and the match isn't lifetime), reconsider.
For grants/denials in the past 6 months, point at statusmatcher.com. Useful for confirming the program is currently accepting matches and what proof is being accepted.
Always use markdown tables. When recommending a match, structure as:
| Field | Value |
|---|---|
| Program | Alaska Atmos Gold |
| Path | Direct Free Match |
| Initial validity | 90 days |
| Challenge | 10,000 base points on Alaska/Hawaiian flights in 90 days |
| Fee | Free |
| Lifetime restriction | ONCE PER LIFETIME |
| Source verified | Alaska primary source |
After the table, give the verdict:
Recommend / Hold / Skip. Reasoning: ...
When the user is on the fence, surface the key question: "do you have flying/staying coming up in the next 6-12 months that uses this status?" If yes, go. If no, the match is worth more later.
# All programs that allow free direct matches
jq '.direct_matches.airlines | to_entries[] | select(.value.fee == "free") | {program: .value.program, lifetime: .value.lifetime_warning}' data/status-match.json
# All paid concierge programs with US fees
jq '.paid_concierge.programs | to_entries[] | {program: .value.program, us_fee: (.value.fees_by_region.us // .value.fees_summary // null)}' data/status-match.json
# All cards that grant hotel status
jq '.card_based_status | to_entries[] | select(.value.renewable_status != null) | {card: .value.card, annual_fee: .value.annual_fee_usd, status: [.value.renewable_status[] | .program + " " + .tier]}' data/status-match.json
# All ONCE PER LIFETIME programs (never miss this warning)
jq '[.direct_matches.airlines, .direct_matches.hotels, .paid_concierge.programs] | add | to_entries[] | select((.value.lifetime_warning // "") | test("LIFETIME"; "i")) | {program: .value.program, warning: .value.lifetime_warning, detail: .value.lifetime_warning_detail}' data/status-match.jsonRecent activity proof. Most matches require proof of current status (status card, activity within last 12 months). Lifetime/promotional/transferred status holders are typically NOT eligible to match FROM (you can't use Lifetime Marriott Platinum to match into Hilton Diamond).
Match into the highest tier you qualify for at time of application. Several programs (Flying Blue specifically) cap your match to the tier you have when applying — you can't upgrade later if your source-program status improves.
Hotel matches usually require a "challenge." A small number of paid stays in 90 days. Award stays, points stays, and OTA-booked stays typically don't count. Direct booking only.
Airline matches often require revenue spending. PQP/MQD requirements during the trial period. Award flights and bonus points don't count.
Statusmatch.com is legitimate. Some users mistake the paid concierge for a scam. It is not. Loyalty Status Co operates with formal partnerships with airlines/hotels. The matches granted are real status that works directly with the program afterward. The fee is the catch, not the legitimacy.
Apply timing matters. Status earned through a match in late summer (post-July 1) often lasts 18+ months because it counts toward both the current and next program year. This is the highest-value timing for most airlines.
points-valuations — when computing whether elite status changes the CPP math (lounge value, upgrade probability, free bag fees saved)trip-calculator — for the fee/value math on Path 2 paid concierge matches: is the application fee less than the value of the perks across the user's expected travel pattern?booking-guidance — once you have status, how to actually use it for bookingalliances — alliance benefits propagate; matched into oneworld Sapphire via Atmos Gold gets you sapphire benefits across all oneworld carrierspartner-awards — status sometimes affects which partner awards are bookable through which programstopovers — elite status sometimes unlocks better stopover treatment on certain programsaward-holds — some programs grant longer hold windows to elite membersWhen sources disagree, primary sources win. When official terms are silent on lifetime restrictions, default to "treat as once per program cycle" and flag UNVERIFIED.
© borski, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/travel-hacking-toolkit/skills/status-match of borski/travel-hacking-toolkit.
Open the folder on GitHubat commit db82131
Status Match next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Status Match this skillborski/travel-hacking-toolkit | 688 | — | ~3.6k | Automated safety check: Pass | MIT | |
| Agent Challengesruvnet/ruflo | 74k | 2 repos | ~995 | Automated safety check: Pass | MIT | |
| Challengealirezarezvani/claude-skills | 28k | 1 repos | ~1.7k | Automated safety check: Pass | MIT | |
| Find Matching Tenderssickn33/agentic-awesome-skills | 47k | 1 repos | ~1k | Automated safety check: Pass | Apache-2.0 | |
| Og URL Matchthedaviddias/Front-End-Checklist | 74k | — | ~543 | Automated safety check: Pass | MIT | |
| Challengepedrohcgs/claude-code-my-workflow | 1.7k | — | ~1.9k | Automated safety check: Notes | MIT |
ruvnet/ruflo
Agent skill for challenges - invoke with $agent-challenges. An agent skill from ruvnet/ruflo.
alirezarezvani/claude-skills
Pre-mortem plan analysis. An agent skill from alirezarezvani/claude-skills.
sickn33/agentic-awesome-skills
Find open AU/NZ government tenders matching what a company does, ranked by fit with why and gap analysis.
thedaviddias/Front-End-Checklist
A skill your agent uses when auditing Open Graph tags or investigating why social share counts appear low.
pedrohcgs/claude-code-my-workflow
Stress-test a finding against the choices you did not make. An agent skill from pedrohcgs/claude-code-my-workflow.
werf/werf
Independent challenge pass for a non-trivial or high-risk change.
borski/travel-hacking-toolkit
Search Amex travel portal for cash prices, MR points pricing, IAP discounts, and FHR/THC hotel benefits via Patchright.
borski/travel-hacking-toolkit
Search Chase UR travel portal via Patchright for cash prices, points pricing, Points Boost offers, and Chase Edit hotel benefits.
borski/travel-hacking-toolkit
Deutsche Bahn train schedules, journey planning, and departures across Germany and into neighboring countries (Austria, Switzerland, Netherlands, France, Belgium).
borski/travel-hacking-toolkit
Search Sutochno.ru (СУТОЧНО.РУ), a Russian short-term apartment-rental platform where you book directly from owners and pay in rubles (Mir card / bank transfer).
borski/travel-hacking-toolkit
Search TicketsAtWork (EBG corporate perks) for hotels, theme park tickets, attractions, and rental cars via Patchright.
borski/travel-hacking-toolkit
Search VRBO (Vrbo / Expedia Group) vacation rentals including entire homes, condos, and cabins via Patchright browser automation.
Status match and status challenge rules for airlines and hotels. Status Match is an agent skill from borski/travel-hacking-toolkit. Status match and status challenge rules for airlines and hotels.
Run `npx skills add borski/travel-hacking-toolkit --skill status-match -a claude-code`. Or copy the skill folder (plugins/travel-hacking-toolkit/skills/status-match in borski/travel-hacking-toolkit) into .claude/skills/status-match in your project. Claude Code loads it when a task matches its description.
Run `npx skills add borski/travel-hacking-toolkit --skill status-match -a codex`. Or copy the skill folder (plugins/travel-hacking-toolkit/skills/status-match in borski/travel-hacking-toolkit) into .agents/skills/status-match in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add borski/travel-hacking-toolkit --skill status-match -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/status-match, .gemini/skills/status-match, .github/skills/status-match and .opencode/skills/status-match in your project.
Going by SKILL.md and its folder, Status Match needs the command-line tools its instructions call (jq). Its frontmatter pre-approves these tools: Bash(jq *).
SKILL.md names 1 domain. As links in the text: statusmatcher.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Status Match is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Status Match: Agent Challenges (ruvnet/ruflo, 74k stars), Challenge (alirezarezvani/claude-skills, 28k stars), Find Matching Tenders (sickn33/agentic-awesome-skills, 47k stars) and Og URL Match (thedaviddias/Front-End-Checklist, 74k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
borski (a GitHub user) maintains it in borski/travel-hacking-toolkit, which has 688 GitHub stars. The repository holds 46 skills in this directory. The repository was last updated on October 5, 2026.
Source: borski/travel-hacking-toolkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.