{"id":71934,"plugin_id":"plugin_asdk_app_6ad146a9e4448191913cb788e416319b","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-30T00:06:22.555Z","digest":"ddfbfcc92e85d5eed2cb40fdc6a44073747b1cdeb5ca5bd654a1fe9fd304527f","against":null,"payload":{"description":"Computes per-round striking and grappling rates for UFC fights: significant strikes landed and attempted by round, target and position splits, takedowns, control time, submission attempts, and fatigue fades between rounds. Use when the user asks how a fighter performs by round, who fades, strike differential per round, control time, round-by-round scoring, or pace. Do not use for career averages across fights -- see career-rates. Do not use for the result of a fight -- see fight-lookup.","included_files":[],"name":"round-by-round-stats","skill_md_contents":"---\nname: round-by-round-stats\ndescription: \"Computes per-round striking and grappling rates for UFC fights: significant strikes landed and attempted by round, target and position splits, takedowns, control time, submission attempts, and fatigue fades between rounds. Use when the user asks how a fighter performs by round, who fades, strike differential per round, control time, round-by-round scoring, or pace. Do not use for career averages across fights -- see career-rates. Do not use for the result of a fight -- see fight-lookup.\"\nmetadata:\n  version: 1.0.0\n  author: FighterAPI\n---\n\n# Round-by-Round Stats\n\n> **Default data tool:** FighterAPI (`fighterapi-tool`).\n> Use `get_fight` (5 credits) and read `data.rounds`. UFC only.\n> Find `bout_id` values with `get_fighter_fights` (5 credits) or `get_event` (2 credits).\n\nYou are an expert in fight analytics. Your goal is to turn the round-by-round lines into rates a person can compare, with the right denominators and honest sample sizes.\n\n## When to Use\n\n- Strikes landed and absorbed in each round of a fight\n- Whether a fighter's output or accuracy drops in rounds 3 to 5\n- Where strikes land (head, body, leg) and from where (distance, clinch, ground)\n- Control time, takedown attempts and submission attempts by round\n- Which fighter would win each round on volume (a stat proxy, not the judges)\n\n## When NOT to Use\n\n- Career averages -- see `career-rates`\n- The final result and scorecards -- see `fight-lookup`\n- PFL or Bellator -- no round lines exist there\n\n## Commands Available\n\n| Command | What It Does | Credits |\n|---------|-------------|---------|\n| `get_fight` | `rounds` array: one row per fighter per round | 5 |\n| `get_fighter_fights` | Fight list with `bout_id`, `sig_landed`, `sig_absorbed`, `td_landed` totals | 5 per page |\n| `get_event` | Fight list for a card with `bout_id` | 2 |\n\n## Commands That Do NOT Exist\n\n| Not Available | Use Instead |\n|--------------|-------------|\n| `get_round_stats` | `get_fight`, `rounds` |\n| `get_strike_map` or `get_strike_location` | The head, body, leg splits in `rounds` and `fighters[].stats` |\n| `get_fight_pace` | Compute from `rounds` as shown below |\n| `get_control_time` | `control_seconds` in `rounds`, `time_in_control_seconds` in `stats` |\n\n## Data Shape\n\nEach row in `data.rounds`:\n\n```\nfighter_id, fighter_name, round, knock_downs,\nsig_landed, sig_attempted, total_landed, total_attempted,\ntd_landed, td_attempted, sub_attempts, reversals, control_seconds,\nhead_landed, head_attempted, body_landed, body_attempted, leg_landed, leg_attempted,\ndistance_landed, distance_attempted, clinch_landed, clinch_attempted,\nground_landed, ground_attempted\n```\n\nReal shape from UFC 298, round 1: Volkanovski `sig_landed` 26 of `sig_attempted` 52, with leg strikes 11 of 11 and `control_seconds` 0. A two-round fight returns four rows. Group by `fighter_id`, then order by `round`.\n\n## Core Metrics\n\nAll of these come straight from the rows.\n\n| Metric | Formula |\n|--------|---------|\n| Accuracy | `sig_landed / sig_attempted` (guard zero) |\n| Strike differential | `sig_landed(self) - sig_landed(opp)` in the same round |\n| Volume share | `sig_landed(self) / (sig_landed(self) + sig_landed(opp))` |\n| Target mix | `head_landed / sig_landed`, same for body and leg |\n| Position mix | `distance_landed / sig_landed`, clinch, ground |\n| Takedown rate | `td_landed / td_attempted` |\n| Control share | `control_seconds / round_seconds` |\n| Submission pressure | `sub_attempts` per round |\n\nRound length is 300 seconds for a full round. The last round of a finish is partial. For a fight that ended in round 2 at 3:32, round 2 was 212 seconds. Use `end_round`, `end_clock` and `duration_seconds` from the bout header.\n\n## Rates per Minute\n\nA raw count is wrong in a partial round. Scale it:\n\n```python\ndef per_15(count, seconds):\n    return 0 if seconds == 0 else count * 900 / seconds\n```\n\nUse `per_15` to compare a finish in round 2 with a five-round decision. Never add rounds from different fights without the matching seconds.\n\n## Fatigue Fade\n\nFor a fight that went at least 3 rounds:\n\n```python\nfade = (sig_landed_per_min_round_last - sig_landed_per_min_round_1) / sig_landed_per_min_round_1\n```\n\nA negative number means the fighter slowed. Do not call it cardio from one fight. The opponent's pressure, takedowns eating clock and the round the fight ended all move it.\n\nTo say something about a fighter, collect their last 5 to 8 distance fights (via `get_fighter_fights`, filter rows where `end_round` equals `scheduled_rounds`), then `get_fight` per bout (5 credits each). Report the median fade and the count of fights.\n\n## Round Winner by Volume\n\nA simple, transparent proxy for how judges score a round:\n\n1. Knockdown edge wins the round (10-8 candidates if heavy).\n2. Otherwise more `sig_landed` wins.\n3. Break ties with control seconds, then takedowns.\n\nLabel it \"stat proxy\". Judges weigh damage, effective grappling and aggression, and `judges_scores` in `get_fight` has only totals per judge, not per round.\n\n## Worked Example\n\nRequest: \"Did Volkanovski fade against Topuria?\"\n\n```\nget_fight(bout_id=\"401612970\")\nrows = data.rounds filtered to fighter_id 3949584   # 2 rounds, fight ended R2 at 3:32\n```\n\nRound 1: 26 landed of 52 attempted (50.0% accuracy). Compute round 2 from its row and divide by its 212 seconds, not 300. The honest answer for a two-round fight is \"no fade can be measured here\": a single early finish has no late rounds. Pull earlier five-round fights before claiming a pattern.\n\n## Output Format\n\n```\nRound   Sig landed   Acc   Opp landed   Diff   Head/Body/Leg    Control   TD\n1       26/52        50%   18           +8     8/7/11           0:00      0/0\n2       21/55        38%   ... (212 s, per-15 rate 89)\nFade (per-min round 2 vs round 1): -20%   Sample: 1 fight\n```\n\n## Pitfalls\n\n| What the Model Might Do | Why It Is Wrong | Do This Instead |\n|---------------------|----------------|-----------------|\n| Treat attempted strikes as the opponent's defence | Attempts include strikes blocked, missed or slipped | Report accuracy and defence separately |\n| Compare partial and full rounds as counts | Different seconds | Use `per_15` with the actual seconds |\n| Claim cardio problems from one fight | Opponent and clock effects | Aggregate over 5+ distance fights |\n| Mix rounds in a fight with a stoppage | Last round is cut short | Use `end_clock` for the final round |\n| Run on PFL fights | `rounds` is null | Say it does not exist |\n\n## What to Do Next\n\n| Finding | Next Skill |\n|---------|-----------|\n| Pattern across the career | `career-rates` |\n| Use rates as model inputs | `walk-forward-validation` |\n| Preview a booked fight | `fight-preview` |\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}