Skip to content

Chore/series performance fix - #49

Merged
Vanshbordia merged 5 commits into
mainfrom
chore/series-performance-fix
Aug 10, 2026
Merged

Chore/series performance fix#49
Vanshbordia merged 5 commits into
mainfrom
chore/series-performance-fix

Conversation

@Vanshbordia

@Vanshbordia Vanshbordia commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Series statistics now support selecting games by position, game ID, or all games.
    • Improved player identification across performance statistics, including kill matrices and notable rounds.
    • Advanced performance fields now use clearer names: economy, plants, and defuses.
  • Bug Fixes

    • Corrected game-specific parsing for rounds and economy data.
  • Documentation

    • Updated examples, identifiers, and guidance for game selection and renamed statistics.
  • Tests

    • Expanded coverage for game selection, parsing accuracy, and player mappings.

- Rename abbreviated series performance fields to descriptive names
  (`econ` → `economy`, `pl` → `plants`, `de` → `defuses`) for improved
  API clarity. Update corresponding documentation examples to use the
  new field names.
- Add thread-safe HTTPCache utility that intercepts `httpx.Client.get`
  requests, with three modes: record (cache live responses to disk),
  replay (use cached responses, live fallback on miss), and live
  (in-memory only, no disk writes). Enables deterministic MDX example
  validation and reduces redundant network requests.
- Update docs-check CI workflow to run MDX example checks with the
  `--live` flag to use fresh vlr.gg data per run. Remove persisted
  fixture caching in CI, as GitHub's branch/PR-scoped cache would
  validate against stale data from branch creation, leading to invalid
  results at merge time. Fixture caching remains a local development
  convenience.
- Add `.cache/mdx-html/` to `.gitignore` to exclude local MDX fixture
  caches from version control.
- Update official documentation example IDs for event teams and team
  completed matches to current valid values, ensuring examples run
  successfully for end users.
Added `cleanup-caches.yml` workflow that deletes docs-check caches on PR closure to avoid accumulating unused caches.

Updated `docs-check.yml` to implement per-branch/PR fixture caching with a 2 hour TTL:
- Main branch runs continue to validate against live `vlr.gg` data with no cache to ensure validation accuracy
- Branch/PR runs reuse fresh cached fixtures when available, falling back to live fetches for missing or stale cache
- Failed runs still save fresh fixtures so subsequent fix commits can reuse them and skip the warm-up step, speeding up CI iteration
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Vanshbordia, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 1 minute

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b2a90c1f-4727-4d09-aec4-73ab7336a27c

📥 Commits

Reviewing files that changed from the base of the PR and between 0e4b7f5 and ec5bab8.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (9)
  • .gitattributes
  • .github/workflows/docs-check.yml
  • .gitignore
  • CHANGELOG.md
  • docs-py/docs/changelog.md
  • official-docs/app/(home)/changelog/page.tsx
  • official-docs/components/home/terminal-demo.tsx
  • pyproject.toml
  • src/vlrdevapi/__init__.py
📝 Walkthrough

Walkthrough

The pull request adds positional game-ID support and team-aware player mapping to series parsers. It renames advanced-stat fields, adds parser coverage, introduces fixture-backed MDX validation, manages workflow caches, and updates documentation examples.

Changes

Series API updates

Layer / File(s) Summary
Game selection and parser contracts
src/vlrdevapi/_series/_utils.py, src/vlrdevapi/_series/{economy,players,rounds}/*, src/vlrdevapi/_series/match_namespace.py
Series parsers now resolve positional game numbers and real VLR game IDs before selecting game data.
Performance identity and field parsing
src/vlrdevapi/_series/performance/*
Performance parsing uses team-aware player mappings and emits economy, plants, and defuses.
Series behavior coverage
tests/series/*
Tests cover game selection, parser equivalence, player IDs, rounds, economy data, and renamed fields.

MDX validation and documentation

Layer / File(s) Summary
Fixture-backed MDX execution
scripts/check_mdx_examples.py
The checker adds HTTP caching, warm and replay phases, live mode, cache statistics, and related CLI options.
Workflow cache lifecycle
.github/workflows/*.yml, .gitignore
Workflows restore, age-check, package, save, and clean up MDX fixtures and pull-request caches.
Documentation example updates
official-docs/content/docs/reference/*, official-docs/content/guides/*
Examples use updated event, team, player, and advanced-stat identifiers.

Estimated code review effort: 4 (Complex) | ~60 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.09% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the series performance fixes, which are a major part of the changeset.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/series-performance-fix

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Aug 10, 2026

Copy link
Copy Markdown

Greptile Summary

The PR improves per-game series statistics, player-ID recovery, parser scoping, documentation validation caching, and releases these changes as version 2.2.0.

  • Resolves positional game numbers to VLR game IDs across series namespaces.
  • Scopes economy and round parsing to the selected game and enriches performance records with player IDs.
  • Renames advanced-stat fields and updates documentation and tests.
  • Pins documentation cache actions to immutable revisions and adds fixture-cache lifecycle handling.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
src/vlrdevapi/_series/_utils.py Adds shared game-ID resolution used by series statistics namespaces.
src/vlrdevapi/_series/performance/parser.py Adds player mapping and updates parsing for renamed advanced-stat fields.
src/vlrdevapi/_series/performance/models.py Renames advanced-stat fields as an explicitly documented breaking release change.
src/vlrdevapi/_series/economy/parser.py Restricts economy parsing to the selected game section.
src/vlrdevapi/_series/rounds/parser.py Corrects selected-game round parsing.
.github/workflows/docs-check.yml Introduces fixture caching and pins both cache actions to immutable commit revisions.
scripts/check_mdx_examples.py Adds live and cached execution modes for documentation-example validation.

Reviews (3): Last reviewed commit: "chore(release): v2.2.0 - breaking field ..." | Re-trigger Greptile

Comment on lines +165 to +167
economy: int | None = Field(default=None, description="Economy rating")
plants: int | None = Field(default=None, description="Spike plants")
defuses: int | None = Field(default=None, description="Spike defuses")

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Advanced-stat fields break compatibility

When existing consumers access or deserialize econ, pl, or de, this model no longer exposes those established fields, causing attribute errors and changing serialized keys without a compatibility path.

Prompt To Fix With AI
This is a comment left during a code review.
Path: src/vlrdevapi/_series/performance/models.py
Line: 165-167

Comment:
**Advanced-stat fields break compatibility**

When existing consumers access or deserialize `econ`, `pl`, or `de`, this model no longer exposes those established fields, causing attribute errors and changing serialized keys without a compatibility path.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Claude Code

Comment thread .github/workflows/docs-check.yml Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (5)
src/vlrdevapi/_series/players/parser.py (1)

326-326: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Align the parser type contract.

parse_players_stats now supports positional integer selectors through resolve_game_id. Its game_id: str annotation still rejects that supported input during static type checking. Change the annotation to int | str.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vlrdevapi/_series/players/parser.py` at line 326, Update the game_id
parameter annotation in parse_players_stats from str to int | str so its type
contract matches the positional integer selectors accepted by resolve_game_id.
.github/workflows/docs-check.yml (2)

84-101: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Fresh runs never add newly fetched pages to the cache.

Both steps require fresh == 'false'. When the cache is fresh, the run uses --skip-warm, and HTTPCache._store writes to disk only in record mode. Pages that are missing from the restored fixtures are fetched live and discarded. Every run inside the 2h TTL then repeats those live fetches.

To let a partially populated cache converge, persist replay fallbacks and save the archive on every branch run. This is a throughput improvement, not a correctness fix.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/docs-check.yml around lines 84 - 101, Update the “Package
fixtures (branch)” and “Save fixture cache (branch)” steps to run on every
non-main branch run, removing the cache-age fresh check. Preserve the existing
archive creation and cache-save behavior so newly fetched pages persisted by
HTTPCache._store can be included in the next cache.

75-82: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Read the fresh output from env here too.

if [ "${{ steps.cache-age.outputs.fresh }}" == "true" ] expands the output into the script text. zizmor flags Line 78. The value comes from the previous step, so the risk is low, but use the same env pattern for consistency.

🛠️ Proposed fix
       - name: Run MDX examples check (branch)
         if: github.ref_name != 'main'
+        env:
+          FRESH: ${{ steps.cache-age.outputs.fresh }}
         run: |
-          if [ "${{ steps.cache-age.outputs.fresh }}" == "true" ]; then
+          if [ "$FRESH" = "true" ]; then
             uv run scripts/check_mdx_examples.py --skip-warm
           else
             uv run scripts/check_mdx_examples.py
           fi
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/docs-check.yml around lines 75 - 82, Update the “Run MDX
examples check (branch)” step to read the cache-age fresh value through an
environment variable, matching the existing env-based pattern, and change the
shell condition to use that variable instead of interpolating
steps.cache-age.outputs.fresh directly.

Source: Linters/SAST tools

.github/workflows/cleanup-caches.yml (1)

3-9: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Fork pull requests cannot delete caches.

The pull_request event gives forked-PR runs a read-only GITHUB_TOKEN. The permissions: actions: write declaration does not raise it. For a fork PR, gh cache delete returns HTTP 403. set +e hides the failure, so the step reports success without deleting anything.

This matches the pattern in the GitHub cache documentation, so no change is required if all contributors push branches to this repository. If fork PRs are expected, switch the trigger to pull_request_target, or run the cleanup on a schedule.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/cleanup-caches.yml around lines 3 - 9, Update the workflow
trigger around the pull_request closed event so forked pull requests can use a
token capable of deleting caches, either by switching to pull_request_target or
by moving cleanup to a scheduled workflow. Preserve the actions: write
permission and existing cleanup behavior.
.gitignore (1)

12-12: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Also ignore the fixture archive.

.github/workflows/docs-check.yml writes fixtures.tar.gz to the repository root. The pattern here covers only .cache/mdx-html/. Add the archive so a local reproduction of the packaging step does not stage it.

🛠️ Proposed addition
 .cache/mdx-html/
+fixtures.tar.gz
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.gitignore at line 12, Update the repository ignore rules alongside the
.cache/mdx-html/ entry to also ignore the root-level fixtures.tar.gz archive
generated by .github/workflows/docs-check.yml.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/docs-check.yml:
- Around line 56-73: Update .github/workflows/docs-check.yml lines 56-73 to pass
steps.mdx-fixtures.outputs.cache-matched-key through an env entry, read it as
$MATCHED_KEY, and validate that the parsed epoch is numeric and not in the
future before calculating age. Update lines 75-82 to pass
steps.cache-age.outputs.fresh through env, read it as $FRESH, and compare it to
"true" without inline step-output interpolation.

In `@scripts/check_mdx_examples.py`:
- Around line 519-528: Update the replay flow around execute_blocks so
RateLimiter.acquire is not globally replaced with a no-op while live fallback
requests remain possible. Preserve rate limiting during fallback fetches, either
by leaving RateLimiter active or by making HTTPCache._throttle globally
serialized using cache-level throttle state initialized in HTTPCache.__init__.

In `@src/vlrdevapi/_series/performance/parser.py`:
- Around line 201-202: Update _parse_notable_rounds so each notable victim
lookup includes the victim’s team context and uses the team-specific PlayerMap
lookup rather than the name-only fallback. When the HTML lacks sufficient team
information, leave player_id as None; preserve the existing NotableVictim
construction and append flow.

---

Nitpick comments:
In @.github/workflows/cleanup-caches.yml:
- Around line 3-9: Update the workflow trigger around the pull_request closed
event so forked pull requests can use a token capable of deleting caches, either
by switching to pull_request_target or by moving cleanup to a scheduled
workflow. Preserve the actions: write permission and existing cleanup behavior.

In @.github/workflows/docs-check.yml:
- Around line 84-101: Update the “Package fixtures (branch)” and “Save fixture
cache (branch)” steps to run on every non-main branch run, removing the
cache-age fresh check. Preserve the existing archive creation and cache-save
behavior so newly fetched pages persisted by HTTPCache._store can be included in
the next cache.
- Around line 75-82: Update the “Run MDX examples check (branch)” step to read
the cache-age fresh value through an environment variable, matching the existing
env-based pattern, and change the shell condition to use that variable instead
of interpolating steps.cache-age.outputs.fresh directly.

In @.gitignore:
- Line 12: Update the repository ignore rules alongside the .cache/mdx-html/
entry to also ignore the root-level fixtures.tar.gz archive generated by
.github/workflows/docs-check.yml.

In `@src/vlrdevapi/_series/players/parser.py`:
- Line 326: Update the game_id parameter annotation in parse_players_stats from
str to int | str so its type contract matches the positional integer selectors
accepted by resolve_game_id.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f241ee59-2b19-449e-8adc-f63912a59387

📥 Commits

Reviewing files that changed from the base of the PR and between 74967f5 and 0e4b7f5.

📒 Files selected for processing (29)
  • .github/workflows/cleanup-caches.yml
  • .github/workflows/docs-check.yml
  • .gitignore
  • official-docs/content/docs/reference/events/teams.mdx
  • official-docs/content/docs/reference/series/performance.mdx
  • official-docs/content/docs/reference/team/completed-matches.mdx
  • official-docs/content/docs/reference/team/stats.mdx
  • official-docs/content/docs/reference/team/upcoming-matches.mdx
  • official-docs/content/guides/getting-started-with-vlrdevapi.mdx
  • scripts/check_mdx_examples.py
  • src/vlrdevapi/_series/_utils.py
  • src/vlrdevapi/_series/economy/namespace.py
  • src/vlrdevapi/_series/economy/parser.py
  • src/vlrdevapi/_series/match_namespace.py
  • src/vlrdevapi/_series/performance/models.py
  • src/vlrdevapi/_series/performance/namespace.py
  • src/vlrdevapi/_series/performance/parser.py
  • src/vlrdevapi/_series/players/namespace.py
  • src/vlrdevapi/_series/players/parser.py
  • src/vlrdevapi/_series/rounds/namespace.py
  • src/vlrdevapi/_series/rounds/parser.py
  • tests/series/economy/test_models.py
  • tests/series/economy/test_parser.py
  • tests/series/performance/test_namespace.py
  • tests/series/performance/test_parser.py
  • tests/series/players/test_namespace.py
  • tests/series/players/test_parser.py
  • tests/series/rounds/test_models.py
  • tests/series/test_game_id.py

Comment on lines +56 to +73
run: |
matched="${{ steps.mdx-fixtures.outputs.cache-matched-key }}"
now=$(date +%s)
if [ -n "$matched" ]; then
epoch="${matched##*-}"
age=$(( now - epoch ))
else
age=999999
fi
if [ "$age" -gt 7200 ]; then
rm -rf .cache/mdx-html
rm -f fixtures.tar.gz
mkdir -p .cache/mdx-html
echo "fresh=false" >> "$GITHUB_OUTPUT"
else
echo "fresh=true" >> "$GITHUB_OUTPUT"
fi
echo "now=$now" >> "$GITHUB_OUTPUT"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Step outputs are expanded inline into run scripts. Both steps interpolate ${{ steps.*.outputs.* }} directly into shell code, so the values become script text before execution. zizmor flags Line 57 and Line 78. Pass each value through env and read it as a shell variable.

  • .github/workflows/docs-check.yml#L56-L73: move steps.mdx-fixtures.outputs.cache-matched-key into an env entry, read it as $MATCHED_KEY, and validate that the parsed epoch is numeric and not in the future.
  • .github/workflows/docs-check.yml#L75-L82: move steps.cache-age.outputs.fresh into an env entry and compare "$FRESH" = "true".
🧰 Tools
🪛 zizmor (1.29.0)

[info] 57-57: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)

📍 Affects 1 file
  • .github/workflows/docs-check.yml#L56-L73 (this comment)
  • .github/workflows/docs-check.yml#L75-L82
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/docs-check.yml around lines 56 - 73, Update
.github/workflows/docs-check.yml lines 56-73 to pass
steps.mdx-fixtures.outputs.cache-matched-key through an env entry, read it as
$MATCHED_KEY, and validate that the parsed epoch is numeric and not in the
future before calculating age. Update lines 75-82 to pass
steps.cache-age.outputs.fresh through env, read it as $FRESH, and compare it to
"true" without inline step-output interpolation.

Source: Linters/SAST tools

Comment on lines +519 to +528
cache.mode = "replay"
print(f"=== Replay execution ({timeout}s timeout per block, offline against fixtures) ===")
orig_acquire = RateLimiter.acquire
RateLimiter.acquire = lambda self: None # type: ignore[method-assign]
try:
replay_start = time.monotonic()
await execute_blocks(results, timeout, cache, "Replay (validated)", record_results=True)
stats.replay = time.monotonic() - replay_start
finally:
RateLimiter.acquire = orig_acquire # type: ignore[method-assign]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Replay disables the global rate limiter while live fallbacks remain possible.

RateLimiter.acquire is replaced with a no-op for the whole replay phase. The workflow comment in .github/workflows/docs-check.yml states that branch runs fall back to live fetches for anything missing, so fallbacks are expected, not exceptional. During fallback, only HTTPCache._throttle limits the rate, and it sleeps per calling thread. Parallel worker threads therefore multiply the request rate by the number of threads. vlr.gg can throttle or block the runner, which fails the docs check.

Keep the limiter active for fallback fetches, or serialize the throttle with the cache lock so the rate is global.

🛠️ Proposed global throttle
     def _throttle(self) -> None:
-        if DEFAULT_RATE_LIMIT > 0:
-            time.sleep(1.0 / DEFAULT_RATE_LIMIT)
+        if DEFAULT_RATE_LIMIT <= 0:
+            return
+        interval = 1.0 / DEFAULT_RATE_LIMIT
+        with self._throttle_lock:
+            wait = self._next_slot - time.monotonic()
+            if wait > 0:
+                time.sleep(wait)
+            self._next_slot = max(self._next_slot, time.monotonic()) + interval

Add the supporting state in __init__:

self._throttle_lock = threading.Lock()
self._next_slot = 0.0
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/check_mdx_examples.py` around lines 519 - 528, Update the replay flow
around execute_blocks so RateLimiter.acquire is not globally replaced with a
no-op while live fallback requests remain possible. Preserve rate limiting
during fallback fetches, either by leaving RateLimiter active or by making
HTTPCache._throttle globally serialized using cache-level throttle state
initialized in HTTPCache.__init__.

Comment on lines +201 to 202
player_id = player_mapping.get(text) if player_mapping else None
victims.append(NotableVictim(name=text, player_id=player_id))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Resolve notable-round victims without a name-only fallback.

PlayerMap.get(text) uses _by_name when no team is supplied. PlayerMap.add() preserves the first ID for that name. If both teams use the same in-game name, a victim can receive the opposing player's ID.

Pass sufficient team context into _parse_notable_rounds and perform a team-specific lookup. If the HTML does not provide enough context, keep player_id as None instead of returning an ambiguous ID.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/vlrdevapi/_series/performance/parser.py` around lines 201 - 202, Update
_parse_notable_rounds so each notable victim lookup includes the victim’s team
context and uses the team-specific PlayerMap lookup rather than the name-only
fallback. When the HTML lacks sufficient team information, leave player_id as
None; preserve the existing NotableVictim construction and append flow.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Aug 10, 2026

Copy link
Copy Markdown

Deploying vlrdevapi with  Cloudflare Pages  Cloudflare Pages

Latest commit: ec5bab8
Status: ✅  Deploy successful!
Preview URL: https://18a1323b.vlrdevapi.pages.dev
Branch Preview URL: https://chore-series-performance-fix.vlrdevapi.pages.dev

View logs

…ings

Pin actions/cache to v6.1.0 via a reviewed commit SHA in the docs-check workflow to mitigate supply chain risks from unpinned action tags. Add eol=lf rules for *.yml and *.yaml files to .gitattributes to enforce consistent LF line endings for workflow files across all operating systems. Add fixtures.tar.gz to .gitignore to prevent generated CI fixture cache archives from being accidentally committed. Fix missing trailing newline at end of .gitattributes.
Updates project changelogs to formalize the v2.2.0 release (2026-08-11) and document all included changes:
- **Breaking change**: Renamed `AdvStatsEntry` fields to descriptive names: `econ` → `economy`, `pl` → `plants`, `de` → `defuses` to improve API clarity.
- **Fix**: Series per-game stat endpoints (`players()`, `rounds()`, `performance()`, `economy()`) now correctly resolve 1-based game numbers to real VLR game IDs, fixing empty results for game number inputs.
- **Fix**: Scoped series economy and round-by-round parsing to the selected game's section only, fixing cross-map data leakage in per-game requests.
- **Fix**: Recover series performance player IDs from the series overview tab, fixing incorrect `0` IDs in performance data.
Added the v2.2.0 version comparison link to the main changelog.

BREAKING CHANGE: Renamed `AdvStatsEntry` fields `econ` to `economy`, `pl` to `plants`, and `de` to `defuses`. All code referencing the old field names must be updated to avoid errors.
@Vanshbordia
Vanshbordia merged commit e27108d into main Aug 10, 2026
11 checks passed
@DaviAlcanfor

Copy link
Copy Markdown
Contributor

Checkout my PR :) I've added the news module

@Vanshbordia
Vanshbordia deleted the chore/series-performance-fix branch August 18, 2026 21:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants