{"id":74754,"plugin_id":"plugin_asdk_app_6ad1467bd8f88191bead2eb0a9b87e49","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-31T15:03:55.308Z","digest":"ddaaca4bd0da92fa704245f760cda000c361a4234278cbbd52272443b830784e","against":null,"payload":{"description":"One-page pre-match brief for an upcoming ATP or WTA match: tournament and surface context, both players' ratings overall and on the surface, recent form, head to head, route through the draw, and the market price if the event is covered. Use when the user asks for a preview, a matchup breakdown, or who is favored in a specific match. Do not use for results: see match-lookup. Do not use for deep single-player work: see player-scouting.","included_files":[],"name":"match-preview","skill_md_contents":"---\nname: match-preview\ndescription: \"One-page pre-match brief for an upcoming ATP or WTA match: tournament and surface context, both players' ratings overall and on the surface, recent form, head to head, route through the draw, and the market price if the event is covered. Use when the user asks for a preview, a matchup breakdown, or who is favored in a specific match. Do not use for results: see match-lookup. Do not use for deep single-player work: see player-scouting.\"\nmetadata:\n  version: 1.0.0\n  author: AcesAPI\n---\n\n# Match Preview\n\n> **Default data tool:** AcesAPI (`acesapi-tool`).\n> A full preview costs about 20 credits: `get_schedule` (2) or `get_matches` (2) to find the match, `get_player` (5) for each player, `get_head_to_head` (3), `get_match` (2) for the odds. Add `get_surface_splits` (3 each) when the surface matters.\n\nYou assemble a decision-ready brief. Lead with who the evidence favors and by how much, then the reasons. Keep every number sourced from a call you made. Say what is missing: there are no serve statistics, injury reports or court-speed data.\n\n## When to Use\n\n- \"Preview tomorrow's Alcaraz match\"\n- \"Who is favored in the Shanghai third round, and why?\"\n- \"Break down the final for me\"\n\n## When NOT to Use\n\n- A finished match: see `match-lookup`\n- A single player's whole profile: see `player-scouting`\n\n## Commands Available\n\n| Command | What It Does | Credits |\n|---------|-------------|---------|\n| `get_schedule` | Find the match, `match_id`, start time, round, court | 2 |\n| `get_match` | Match record, ratings (null before play), and the `odds` array | 2 |\n| `get_player` | Bio, ratings by surface, career record, last 10 | 5 |\n| `get_head_to_head` | Meetings, by surface, in finals | 3 |\n| `get_surface_splits` | Record on today's surface | 3 |\n| `get_player_stats` | Record against top-10 and top-50 opponents | 3 |\n| `get_tournament` | The draw: who each player has beaten to get here | 2 |\n| `get_rankings` | Ranking and points, if the question is about seeding | 2 |\n| `search_players` | Ids from names | 1 |\n\n## Commands That Do NOT Exist\n\n| Not Available | Use Instead |\n|--------------|-------------|\n| `get_preview` | This skill builds it from the calls above |\n| `get_odds` | `get_match` and read `odds` |\n| `get_serve_stats` | Not available |\n| `get_court_speed` | Not available: use surface and the `indoor` flag only |\n| `get_injury_report` | Not available: say so, and look at recent retirements in `get_player_matches` |\n\n## How It Works\n\n**Step 1: Find the match.** `get_schedule {\"days\": 2}`. Real fields: `match_id`, `tournament`, `surface`, `indoor`, `round`, `court`, `starts_at`, `player1`, `player2`, `seed1`, `seed2`, `status`. `indoor` can be `null` when unknown; do not assume.\n\n**Step 2: Pull the match record and price.** `get_match {\"match_id\": \"...\"}`. Before play, `players[].rating` is `null` (real response for a scheduled match), so take ratings from `get_player` or `get_ratings`. `odds` has one row per book if the event is a Grand Slam, a Masters or a WTA 1000; otherwise it is empty.\n\n**Step 3: Ratings and form.** `get_player` for each player: overall rating, surface rating and match count on today's surface, career record, last 10. Compute the rating change over the last 10 completed matches as the form signal (see `player-scouting`).\n\n**Step 4: Head to head.** `get_head_to_head`. Weigh by sample size (see `head-to-head-analysis`).\n\n**Step 5: Route.** `get_tournament` for the event: list each player's wins so far, and total games or sets dropped. A player who has played three three-setters carries more load than one who has won in straight sets. This is a signal from scores, not from physical data, so say \"load proxy\".\n\n**Step 6: Model probability.** Elo probability from `surface-elo`. If the event is covered, add the no-vig close from `odds-analysis`. Do not force them to agree; show both.\n\n**Step 7: Write the brief.**\n\n## Worked Example (structure with real fields)\n\nMatch: Alexander Zverev vs Quentin Halys, Shanghai Masters 2026, Round 3, hard, scheduled 2026-10-11. From `get_match`:\n\n- `rating` was `null` for both (not played yet), so ratings come from `get_player`\n- `odds` had six books. Pinnacle close: Zverev -673, Halys +537, margin 2.8%, no-vig Zverev about 84.7%\n- `games_spread1` -3.5 and `games_total` 22.5 at Pinnacle (a two-set match line)\n\nBrief:\n\n```\nZverev (-673) vs Halys (+537), Shanghai R3, hard\nMarket: Zverev ~85% no-vig (Pinnacle), range across books [x]% to [y]%\nRating: Zverev [overall / hard], Halys [overall / hard]  -> model [z]%\nH2H: [a]-[b] ([n] matches), last meeting [date]\nLoad: games and sets dropped so far this event\nGames line: Zverev -3.5 games, total 22.5\nMissing: serve data, injuries, court speed\n```\n\nCost: 2 (schedule) + 2 (match) + 10 (two players) + 3 (head to head) = 17 credits.\n\n## Reading Tennis Matchups from Scores\n\n| Signal | Source | Use |\n|--------|--------|-----|\n| Surface fit | `get_surface_splits` games-won share on the surface, with match count | Is the surface rating real? |\n| Big-match record | `get_player_stats` vs top 10 and top 50 | Quality of wins |\n| Tiebreak record | `tiebreaks_won`, `tiebreaks_lost` | Close-set tendency (small sample) |\n| Deciding sets | `deciding_sets_won` of `deciding_sets` | Noisy, do not lean on it |\n| Time since last match | `last_match` in `search_players` | Rust or fatigue (days off) |\n| Format | Best of five at men's Slams, otherwise best of three | Favorites win more in best of five |\n\n## Credit Usage\n\n| Brief depth | Calls | Credits |\n|-------------|-------|---------|\n| Quick: match, price, ratings | `get_schedule`, `get_match`, `get_ratings` | about 6 |\n| Standard | + `get_player` x2, `get_head_to_head` | about 20 |\n| Full with route and splits | + `get_tournament`, `get_surface_splits` x2 | about 28 |\n\n## Anti-patterns\n\n| What the Model Might Do | Why It's Wrong | Do This Instead |\n|---------------------|---------------|-----------------|\n| Invent serve numbers | Not in the data | Name the gap |\n| Use `rating.after` from `get_match` | Contains the result | Pre-match ratings only |\n| Declare a favorite from rank alone | Rank is a points total and can lag form | Use Elo plus market |\n| Skip the tour check | WTA needs `league: \"wta\"` | Pass it everywhere |\n| Quote odds for an uncovered event | The array is empty | Say the event is outside coverage |\n| Rely on a 2-meeting head to head | Too small | Down-weight it |\n\n## Output Format\n\n```\n[P1] vs [P2]  |  [Tournament], [Round], [Surface], [start time UTC]\nLean: [P] at [x]% (model), market [y]% (no-vig close, Pinnacle) \nWhy: 1) ... 2) ... 3) ...\nRisks and gaps: ...\n```\n\nAlways include \"Estimates, not guarantees\" when probabilities are shown, and never present a lean as a bet recommendation.\n\n## What to Do Next\n\n| What You Found | Next Action | Skill |\n|----------------|-------------|-------|\n| Totals or set markets of interest | Model them | `set-score-modeling` |\n| Thin surface sample | Check the rating blend | `surface-elo` |\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}