Skip to content

fix(predict): world cup fixes cp-7.80.0#30878

Merged
matallui merged 19 commits into
mainfrom
predict/world-cup-fixes
Jun 2, 2026
Merged

fix(predict): world cup fixes cp-7.80.0#30878
matallui merged 19 commits into
mainfrom
predict/world-cup-fixes

Conversation

@matallui

@matallui matallui commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Description

This PR bundles several fixes and improvements to the Predict World Cup experience and the shared sports scoreboard.

1. Live games no longer disappear from the Live tab

Live World Cup soccer markets were being filtered out of the Live tab while the matches were still ongoing.

Root cause: live game markets carry recurrence: DAILY and a market-level endDate set to the match's scheduled end. In getVisiblePredictMarket, the time-based expiry check ran before the game-market check, and for any non-ended game it fell through to the daily endDate <= now staleness heuristic. Soccer matches routinely run past their scheduled endDate (stoppage time, halftime, extra time, penalties), so ongoing games were wrongly treated as expired and hidden.

Fix: isPredictMarketExpiredByTime is now authoritative for game markets — a game market expires only when the game itself is over (status === 'ended' or an endTime is stamped), never via the scheduled endDate. The daily endDate heuristic still applies to non-game daily markets.

2. Broaden the live query (drop series_id)

The live query now uses tag_slug + live=true (instead of series_id), which is enough to return all live games. This lets us repoint the Live UI (e.g. to all soccer leagues) purely via the tagSlug feature flag. seriesId has been removed entirely from PredictWorldCupConfig, its default flag, schema, and data-config types since it is no longer read anywhere.

3. Scoreboard: live status text + shared component

  • The scoreboard center status now formats based on the game's period/elapsed/sport:
    • {period} at a breaking/terminal period (e.g. "Halftime", "Final")
    • {elapsed}’ for soccer during running play (e.g. "75’")
    • {period} • {elapsed} for other sports during running play (e.g. "Q1 • 8:15")
  • Extracted the card's scoreboard UI into the shared PredictSportScoreboard component (replacing the legacy details-screen UI) so the card and the game details screen render the same scoreboard. It supports a compact variant for carousel cards.
  • Fixed the pulsing "Live" dot alignment so the dot sits to the left of the centered "Live" label, with the elapsed/status text centered on the same axis (per Figma).

Changelog

CHANGELOG entry: null

Related issues

Fixes: PRED-942

Manual testing steps

Feature: Predict World Cup Live tab

  Scenario: A live match that has run past its scheduled end time stays visible
    Given the Predict World Cup feature is enabled
    And a soccer match is in progress (game status "ongoing")
    And the match has already passed its scheduled market endDate (e.g. it is in stoppage/extra time)

    When the user opens the World Cup "Live" tab
    Then the ongoing match is still listed in the Live tab
    And it only disappears once the game reports status "ended"

  Scenario: Live query returns games via tag slug
    Given the Predict World Cup feature flag tagSlug is set
    When the Live tab loads
    Then markets are fetched using tag_slug + live=true (no series_id)
    And changing tagSlug via feature flag scopes the Live tab to the configured tag

Feature: Sports scoreboard

  Scenario: Live status text reflects the game state
    Given a live game card or the game details screen
    When the game is at a running period
    Then soccer shows "{elapsed}’" (e.g. "75’") and other sports show "{period} • {elapsed}" (e.g. "Q1 • 8:15")
    And at a break it shows the period label (e.g. "Halftime"), and when finished it shows "Final"

  Scenario: Scoreboard is consistent between card and details
    Given a sports market
    When viewing it as a card and on the game details screen
    Then both render the same scoreboard (team logos, scores, live/scheduled/final status, team names)

Screenshots/Recordings

Before

After

Screen.Recording.2026-06-01.at.1.35.20.PM.mov

Pre-merge author checklist

Pre-merge reviewer checklist

  • I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed).
  • I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots.

Note

Medium Risk
Touches market visibility, remote feature-flag parsing, and live betting UI gating; well-tested but affects what users see during live matches and World Cup rollout.

Overview
Fixes Predict World Cup Live and sports UI by aligning game lifecycle, queries, and a shared scoreboard.

Live tab / staleness: Game markets no longer expire from the scheduled market endDate while play is still ongoing (e.g. stoppage/extra time). Expiry uses shared isGameEnded (status === 'ended', FT/VFT, or endTime), matching scoreboard “Final” and buy-button gating.

World Cup queries & flags: Live fetch uses tag_slug + live=true (drops series_id). seriesId is removed from config/types; PredictWorldCupSchema uses type() so legacy/extra remote keys (e.g. seriesId) don’t fail parsing and disable the feature.

Scoreboard: Inline card UI moves to PredictSportScoreboard ( compact, optional parent gameUpdate to avoid duplicate WebSocket). Status text: soccer minutes (75’), other sports Q • clock, breaks/halftime/final via getSportLiveStatusText. Sport cards hide buy buttons at full time before status flips to ended. Possession/winner trophy UI removed from scoreboard.

Reviewed by Cursor Bugbot for commit 37ef6ba. Bugbot is set up for automated code reviews on this repo. Configure here.

Live World Cup soccer markets were being filtered out of the Live tab
while matches were still ongoing.

Root cause: live game markets carry recurrence=DAILY and a market-level
endDate set to the *scheduled* match end. getVisiblePredictMarket ran the
time-based expiry check before the game-market check, and
isPredictMarketExpiredByTime fell through to the daily endDate<=now
heuristic for any non-ended game. Matches routinely run past their
scheduled endDate (stoppage/extra time, penalties), so ongoing games were
wrongly treated as expired and hidden.

Fixes:
- isPredictMarketExpiredByTime is now authoritative for game markets: a
  game expires only when the game itself is over (status 'ended' or an
  endTime is stamped), never via the scheduled endDate.
- Drop series_id from the live query; tag_slug + live=true is enough, so
  the Live UI can be repointed (e.g. to all soccer) via feature flag.
- Remove debugging console logs.

PRED-942
@github-actions

github-actions Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

CLA Signature Action: All authors have signed the CLA. You may need to manually re-run the blocking PR check if it doesn't pass in a few minutes.

@github-actions github-actions Bot added the pr-not-ready-for-e2e Skip E2E and block merging. Remove this label once the PR is ready to run the E2E tests. label Jun 1, 2026
@mm-token-exchange-service mm-token-exchange-service Bot added the team-predict Predict team label Jun 1, 2026
@github-actions github-actions Bot added the size-S label Jun 1, 2026
@matallui matallui marked this pull request as ready for review June 1, 2026 16:32
@matallui matallui requested a review from a team as a code owner June 1, 2026 16:32
@matallui matallui removed the pr-not-ready-for-e2e Skip E2E and block merging. Remove this label once the PR is ready to run the E2E tests. label Jun 1, 2026
@github-actions github-actions Bot added the risk:medium AI analysis: medium risk label Jun 1, 2026
@matallui matallui changed the title fix(predict): keep ongoing live World Cup games visible in Live tab fix(predict): keep ongoing live World Cup games visible in Live tab cp-7.80.0 Jun 1, 2026
matallui added 5 commits June 1, 2026 12:57
The live elapsed time was centered against the dot + "Live" group, leaving
it offset from the "Live" label. Per Figma, the pulsing dot now sits to the
left of the centered "Live" text (absolutely positioned so it no longer
affects layout), so "Live" and the elapsed time share the same center axis.

PRED-942
The absolute-positioned dot anchored to the full-width column, drifting
toward the score on the left. Replace it with an in-flow dot plus an
invisible spacer of equal width on the right, so the dot stays adjacent to
"Live" while the label and elapsed time remain centered on the same axis.

PRED-942
Adds period/elapsed-aware live status text and extracts the card scoreboard
into the shared PredictSportScoreboard component (replacing the legacy
details-screen UI) so cards and the game details screen render the same
scoreboard.

Live status text now follows three formats:
- "{period}" at a breaking/terminal period (e.g. Halftime, Final)
- "{elapsed}’" for soccer during running play (e.g. 75’)
- "{period} • {elapsed}" for other sports during running play (e.g. Q1 • 8:15)

- Add getSportLiveStatusText/isBreakingPeriod helpers (utils/scoreboard.ts)
- Add isSoccerLeague (constants/sports.ts)
- Rewrite PredictSportScoreboard to the card scoreboard UI (logos, scores,
  live/scheduled/final center, team names); supports a compact variant
- Refactor PredictMarketSportCard to render PredictSportScoreboard

PRED-942
@github-actions github-actions Bot added size-XL and removed size-S labels Jun 1, 2026
Comment thread app/components/UI/Predict/hooks/usePredictWorldCup.ts
@github-actions github-actions Bot added risk:low AI analysis: low risk and removed risk:medium AI analysis: medium risk labels Jun 1, 2026
The live query now uses tag_slug + live=true, so seriesId is no longer read
anywhere in the World Cup flow. Remove it entirely from PredictWorldCupConfig,
its default flag, schema, and the data-config Pick types so callers no longer
supply a dead field.

Addresses PR review (Cursor Bugbot) on usePredictWorldCup data config.

PRED-942
@matallui matallui changed the title fix(predict): keep ongoing live World Cup games visible in Live tab cp-7.80.0 fix(predict): world cup fixes cp-7.80.0 Jun 1, 2026
@matallui matallui enabled auto-merge June 2, 2026 03:23
@MarioAslau

Copy link
Copy Markdown
Contributor

Hey @matallui found these:

🔴 High severity

H1. Removing seriesId from the schema can silently disable World Cup if the remote flag still sends it

Files: schemas/flags.ts, types/flags.ts, constants/flags.ts, utils/resolvePredictFeatureFlags.ts

PredictWorldCupSchema is built with superstruct's strict object(), applied via create(...) in schemas/utils.ts. Strict object() throws when the input contains a key not declared in the schema. Verified empirically against the repo's @metamask/superstruct:

create({ a:'1', b:'2', seriesId:'extra' }, object({ a, b }))
// THREW: At path: seriesId -- Expected a value of type `never`, but received: "extra"

In resolvePredictFeatureFlags, that thrown error is caught and the config falls back to the disabled default (DEFAULT_PREDICT_WORLD_CUP_FLAG.enabled === false):

const parsedPredictWorldCup = parse(
  unwrapRemoteFeatureFlag(flags.predictWorldCup),
  PredictWorldCupSchema,
  DEFAULT_PREDICT_WORLD_CUP_FLAG, // <-- returned on any parse error
);

So if the live remote feature-flag payload still contains seriesId (likely, since remote config is managed independently of client releases and seriesId was previously valid), after this client ships create() throws → parse() returns the disabled default → World Cup is silently turned off for all users, regardless of enabled/showWorldCupScreen.

This isn't caught by tests because all unit tests were edited to drop seriesId from their inputs (e.g. schemas/flags.test.ts "preserves configured IDs").

Fix (pick one):

  • Tolerate the legacy key: seriesId: optional(string()) (deprecated but accepted), or
  • Switch the World Cup schema from object() to type() so unknown remote keys are ignored, or
  • Coordinate removal of seriesId from the remote flag payload before/with this release, and add a regression test asserting an extra/legacy key does not break parsing.

Side note: under the current strict object(), any future remote-only field addition would also break parsing — type() would make this forward-compatible.


🟠 Medium severity

M1. Game-details scoreboard loses features and changes team ordering

Files: components/PredictSportScoreboard/PredictSportScoreboard.tsx (used by PredictGameDetailsContent.tsx)

The details screen renders the same PredictSportScoreboard that was rewritten. The previous version supported possession indicators, winner trophies, team abbreviations, and draw-capable / home-first ordering (US sports rendered away-team-left per convention). The rewrite drops all of these and always renders home team on the left.

So on the details screen (not just the card), non-soccer leagues now flip to home-on-left and lose possession/winner/abbreviation UI. Likely intentional unification, but please confirm against Figma for the details screen. PredictSportWinner and the league-config PossessionIcon wiring appear to become dead code (cleanup opportunity).

M2. Broadened live query drops series_id scoping — verify on the real API

Files: utils/worldCup.ts, queries/worldCup.ts, hooks/usePredictWorldCup.ts

Live query changes from series_id=11433&tag_id=…&live=true to tag_slug=fifa-world-cup&tag_id=…&live=true. This assumes the backend treats tag_slug + tag_id + live=true as an AND returning exactly the intended games. If they're OR-ed or tag_slug is broader than series_id, the Live tab could surface unexpected markets. Unit tests only assert the query string — confirm equivalent scoping against the actual API.

@codecov-commenter

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.72131% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.72%. Comparing base (044726b) to head (1a43945).
⚠️ Report is 5 commits behind head on main.

Files with missing lines Patch % Lines
.../PredictMarketSportCard/PredictMarketSportCard.tsx 66.66% 0 Missing and 1 partial ⚠️
.../PredictSportScoreboard/PredictSportScoreboard.tsx 96.87% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##             main   #30878   +/-   ##
=======================================
  Coverage   82.72%   82.72%           
=======================================
  Files        5566     5568    +2     
  Lines      143286   143290    +4     
  Branches    33099    33079   -20     
=======================================
+ Hits       118529   118542   +13     
+ Misses      16870    16863    -7     
+ Partials     7887     7885    -2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Switch PredictWorldCupSchema from strict object() to type() so unknown keys
in the remote feature-flag payload are ignored instead of throwing.

Remote config is managed independently of client releases. After removing
seriesId from the client, a remote payload still containing seriesId would
make superstruct's strict object() throw, parse() would fall back to the
disabled default, and World Cup would be silently turned off for all users.
type() also makes the flag forward-compatible with future remote-only fields.

Also removes the now-dead PredictSportWinner component (no longer used after
the scoreboard unification).

Addresses PR review (H1 schema strictness, M1 dead-code cleanup).

PRED-942
@matallui

matallui commented Jun 2, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the thorough review @MarioAslau — great catch on H1.

H1 (schema strictness → silent disable): fixed in ed4b511aa4.
Confirmed empirically against the repo's @metamask/superstruct: strict object() throws on the extra seriesId key, and parse() then returns the disabled DEFAULT_PREDICT_WORLD_CUP_FLAG. Since the remote payload very likely still carries seriesId, that would have silently turned World Cup off for everyone.

Fix: switched PredictWorldCupSchema from object() to type() so unknown/legacy remote keys are ignored (declared fields are still validated and defaulted). This also makes the flag forward-compatible with any future remote-only field. Added a regression test (schemas/flags.test.ts → "tolerates unknown/legacy keys…") asserting a payload containing seriesId + an unknown field parses with enabled/showWorldCupScreen preserved and defaults still applied. No coordination with the remote payload is now required to ship safely.

M1 (details scoreboard feature/ordering change): intentional unification.
The scoreboard extraction deliberately standardizes the card's simpler look (32px logos, team names, home-on-left) across both the card and the details screen, dropping the legacy possession/winner/abbreviation UI — this was the explicit goal of the change. I'll confirm the details-screen layout against Figma before marking ready. On the cleanup note: I removed the now-dead PredictSportWinner component in ed4b511aa4. I left the league-config PossessionIcon capability (and PredictSportFootballIcon) in place since it's an optional, documented config hook with its own tests — happy to strip it too if we'd rather not keep the unused capability.

M2 (live query scoping): valid, needs API confirmation.
The switch to tag_slug=fifa-world-cup&tag_id=…&live=true is the intended mechanism so the Live tab can be repointed (e.g. to all soccer) purely via the tagSlug feature flag. The unit tests only assert the query string, as you note — I'll verify against the real API that tag_slug + tag_id + live=true are AND-scoped and return exactly the intended live games before this merges.

Soccer (and other draw-capable leagues) display the home team on the left,
while US sports (e.g. American football) follow the away-then-home convention.
The scoreboard rewrite had hardcoded home-on-left; restore the original
isHomeFirst ordering via isSoccerLeague, keeping testIDs tied to team identity.

Possession/winner indicators remain dropped (not part of the new designs).

Addresses PR review (M1 team ordering).

PRED-942
@github-actions github-actions Bot added risk:medium AI analysis: medium risk and removed risk:low AI analysis: low risk labels Jun 2, 2026
Restore the flipped prop on the right-side team icon so directional icons
(e.g. NFL helmets) mirror to face the left-side team, matching the original
scoreboard. The rewrite's renderTeamLogo helper had dropped flipped, leaving
both helmets pointing the same way on cards and the game details screen.

Addresses PR review (Bugbot: away team icon no longer rendered flipped).

PRED-942
@github-actions github-actions Bot added risk:low AI analysis: low risk and removed risk:medium AI analysis: medium risk labels Jun 2, 2026
matallui added 2 commits June 2, 2026 07:51
PredictMarketSportCard subscribes to live game updates for its buy-button
logic; it now passes that gameUpdate down to PredictSportScoreboard instead of
the scoreboard opening a second subscription. The scoreboard only self-
subscribes when no update prop is provided (e.g. standalone on the details
screen), eliminating the duplicate WebSocket connection and 1s polling
interval per card.

Addresses PR review (Bugbot: duplicate WebSocket subscription for same game).

PRED-942
@MarioAslau

MarioAslau commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Hey @matallui I found this:

M2. en.json removes third_place_match while 14 other locale files still contain it

File: locales/languages/en.json

-        "group_l": "Group L",
-        "third_place_match": "Third Place Match"
+        "group_l": "Group L"

third_place_match is no longer referenced anywhere in the Predict code, so removing it is reasonable cleanup — but the key still exists in zh/vi/tr/tl/ru/pt/ko/ja/id/hi/fr/es/el/de.json. MetaMask's locale-consistency tooling treats en.json as the source of truth, so removing a key only from English can trip the locale verification CI step (orphaned keys in other locales). Either remove it from all locale files or leave it in en.json. (Also note the copy tweaks QuarterfinalsQuarter-finals, SemifinalsSemi-finals are en-only and similarly diverge from the other locales.)

…ales

en.json (the locale source of truth) dropped predict.world_cup.stages
.third_place_match, but 14 other locale files still contained it, leaving
orphaned keys that diverge from English and can trip locale-consistency
tooling. Remove the key from all of them; it is unused in code.

Addresses PR review (locale consistency).

PRED-942
@matallui

matallui commented Jun 2, 2026

Copy link
Copy Markdown
Contributor Author

Good catch on the orphaned key @MarioAslau — fixed in f073934982.

Since en.json is the locale source of truth (per locales/README-HOW-TO-UPDATE.md, the update script removes any extra keys from other locales), I removed the now-orphaned predict.world_cup.stages.third_place_match from all 14 locale files (de/el/es/fr/hi/id/ja/ko/pt/ru/tl/tr/vi/zh). The key is unused in code and en.json only keeps third_place ("Third Place"), so removing it everywhere is the consistent fix. Minimal diff (one line per file, comma fixed), all files re-validated as JSON, and I confirmed the world_cup.stages key sets now match en.json exactly across all locales.

On the copy tweaks (QuarterfinalsQuarter-finals, SemifinalsSemi-finals): those are English-only value changes — the quarterfinals/semifinals keys exist in every locale, so there's no key divergence or CI risk. The other locales keep their own translations (e.g. de "Viertelfinale"), which remain valid; this is just an en copy/style refinement, not a consistency issue.

matallui added 2 commits June 2, 2026 10:26
The scoreboard treats a full-time period ('FT'/'VFT') as ended (renders
"Final"), but the card's buy-button gating only checked status !== 'ended'.
When a provider reports a terminal period before flipping status to 'ended',
the card showed buy buttons on a game that visually reads "Final".

Extract a shared isGameEnded(status, period) helper and use it in both the
scoreboard (Final rendering) and the card (showBuyButtons gating) so they
agree on when a game is over.

Addresses PR review (Bugbot: card buy buttons visible when scoreboard shows Final).

PRED-942
Comment thread app/components/UI/Predict/utils/scoreboard.ts Outdated
marketStaleness treated a stamped game.endTime as game-over for market
visibility, while the scoreboard/card isGameEnded only checked status==='ended'
and FT/VFT periods. A provider stamping endTime while status is still 'ongoing'
could hide the market while the scoreboard and buy CTAs still showed in-play.

Generalize isGameEnded to a single canonical predicate over all terminal
signals (status 'ended' OR FT/VFT period OR stamped endTime) and use it in the
scoreboard, the card buy-button gating, and marketStaleness, so visibility and
UI never disagree. Added unit/regression tests for the endTime and FT cases.

Addresses PR review (Bugbot: endTime not ending UI state).

PRED-942

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 37ef6ba. Configure here.

Comment thread app/components/UI/Predict/utils/scoreboard.ts
@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

🔍 Smart E2E Test Selection

  • Selected E2E tags: SmokePredictions, SmokeWalletPlatform, SmokeConfirmations
  • Selected Performance tags: None (no tests recommended)
  • Risk Level: medium
  • AI Confidence: 88%
click to see 🤖 AI reasoning details

E2E Test Selection:
The PR makes targeted changes to the Predict/WorldCup feature area:

  1. API query refactoring: Removes seriesId from PredictWorldCupConfig and replaces it with tagSlug for the "live" tab query. This changes how the World Cup live markets are fetched from the Polymarket API.

  2. New scoreboard utility: Adds scoreboard.ts with centralized isGameEnded, getSportLiveStatusText, getSportPeriodLabel, and isBreakingPeriod functions. This is a new single source of truth for game state logic used by the scoreboard UI, market staleness filtering, and buy-button gating.

  3. Market staleness fix: marketStaleness.ts now uses the canonical isGameEnded function instead of just status === 'ended', fixing cases where games running into stoppage/extra time were incorrectly filtered out.

  4. Schema tolerance: PredictWorldCupSchema switched from strict object() to type() to tolerate unknown keys (like the legacy seriesId) in remote feature flag payloads, preventing silent feature disablement.

  5. Component cleanup: PredictSportWinner (trophy SVG) deleted, PredictSportScoreboard testIds simplified.

  6. Localization: Minor text changes ("Quarterfinals" → "Quarter-finals", "Semifinals" → "Semi-finals") and removal of "Third Place Match" key across all 20 language files.

Tag selection rationale:

  • SmokePredictions: Primary tag - all changes are within the Predict feature (WorldCup screen, sports scoreboard, market staleness, feature flags). The World Cup live tab query change and game-ended logic could affect market visibility and position display.
  • SmokeWalletPlatform: Required by SmokePredictions description - Predictions is a section inside the Trending tab, and changes to Predictions views affect Trending.
  • SmokeConfirmations: Required by SmokePredictions description - opening/closing positions are on-chain transactions.

No changes to core Engine, controllers, navigation infrastructure, or other feature areas. The changes are well-scoped to the Predict feature.

Performance Test Selection:
No performance-sensitive changes in this PR. The changes are limited to: (1) API query parameter refactoring (seriesId → tagSlug), (2) new utility functions for game state logic, (3) schema tolerance for unknown keys, (4) component deletion (PredictSportWinner), and (5) localization string updates. None of these affect list rendering performance, state management at scale, app startup, or other performance-critical paths. The @PerformancePredict tag could theoretically apply but the changes don't introduce new rendering complexity or data loading patterns that would meaningfully impact performance metrics.

View GitHub Actions results

@matallui matallui added this pull request to the merge queue Jun 2, 2026
Merged via the queue into main with commit 2b6abc7 Jun 2, 2026
198 of 199 checks passed
@matallui matallui deleted the predict/world-cup-fixes branch June 2, 2026 21:12
@github-actions github-actions Bot locked and limited conversation to collaborators Jun 2, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

risk:low AI analysis: low risk size-XL team-predict Predict team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants