You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
One cleanup PR that removes both halves of the current ranking mechanic — the ELO league-points subsystem and the weekly Slack "top 3 reviewers" broadcast. Replacement surfaces (#1272, #1273) read from practice_finding directly without any ELO-derived input.
ELO-display components on leaderboard / profile rendering rank, league points, league-change tooltips
API contract:
Existing LeaderboardController routes retain their paths for this sub-issue's duration (full surface deletion is refactor(server): extract ProfileActivityService from leaderboard internals #1272's scope); responses no longer include leaguePoints, leagueChange, or rank fields produced by deleted services. A response-shape regression test asserts the absent fields.
The SlackMessageService from #1246 is not deleted — it remains as a per-workspace utility used by other Slack-side surfaces. Only the leaderboard-task path through it is removed.
Why
The leaderboard transformation epic's foundational decision is that ELO ranking + public weekly broadcasts contradict the SDT-aligned formative-feedback mentor thesis the rest of the product is built around. Deleting both mechanisms — not flagging them off — is the right operational move: a flag-gated leaderboard rots and leaks (the existing WorkspaceFeatures.leaderboardEnabled is webapp-only and the API leaks the data regardless, captured as a separate fix in #1276); deleted code cannot leak. Combining both deletions into one PR keeps the cleanup atomic — the rest of the epic depends on the namespace being clear.
Acceptance criteria
Every class listed above is deleted from server/application-server/src/main/java/de/tum/in/www1/hephaestus/; build succeeds; no remaining import references the deleted symbols
LeaderboardSortType.LEAGUE_POINTS is removed; any controller / service method that accepted it as a parameter rejects requests carrying it with a structured 400; test asserts the failure shape is helpful
LeaguePointsRecalculator SPI is removed; implementations in feature modules are deleted or simplified to no-op stubs in the same PR
LeaguePointsRecalculator and SlackWeeklyLeaderboardTask@Scheduled registrations are gone; Spring starts cleanly with no UnknownConfigurationProperty warning, no startup error
LeaderboardProperties.workspaceSlugs is removed from class + application.yml; no @ConfigurationProperties binding remains
LeagueIcon, ScoringExplanationDialog, and any ELO-display webapp components are deleted; profile page asserts no data-testid containing league is present (Playwright)
Webapp build does not import any deleted symbol; a build-time check (tsc strict + existing import-lint) fails the PR if a dead reference remains
All unit tests covering deleted classes are deleted; test-count delta matches deletion expectations recorded in the PR description
An ArchUnit test rejects any new code referencing deleted class names under de.tum.in.www1.hephaestus (covers LeaguePoints*, LeagueChange*, LeaguePointsConstants, SlackWeeklyLeaderboardTask)
An integration test exercises a non-leaderboard Slack message path and asserts SlackMessageService still works (the survivor is intact)
CHANGELOG entry under "Breaking changes" documents that workspace API responses no longer carry leaguePoints / leagueChange / rank fields, and that the weekly top-3 reviewers broadcast is removed; release notes frame the change as "replacing the broadcast with per-user reflection" via feat(server): MentorReflectionScheduler with per-user cadence and time of day #1258
Tests to write
Compile-time + ArchUnit-time assertions are the bulk of the test work.
Regression integration test for LeaderboardController endpoints asserting response shapes are stripped of deleted fields.
Webapp Playwright spec on the profile page asserting no league icon / score badge renders.
Spring-startup cleanliness test (no warnings / errors related to removed bindings).
Database fixtures / seeds referencing deleted constants are updated to use LeaderboardSortType.XP_TOTAL (or its successor in the new contract) as default during transition.
Part of #1206.
What ships
One cleanup PR that removes both halves of the current ranking mechanic — the ELO league-points subsystem and the weekly Slack "top 3 reviewers" broadcast. Replacement surfaces (#1272, #1273) read from
practice_findingdirectly without any ELO-derived input.Server-side deletions (Java, application-server):
LeaguePointsService,LeaguePointsRecalculationService,LeaguePointsUpdateTask,LeagueChangeDTO,LeaguePointsConstantsLeaderboardSortType.LEAGUE_POINTSenum constant (the enum itself is removed by refactor(server): extract ProfileActivityService from leaderboard internals #1272's API refactor; this sub-issue removes the constant + every reference)LeaguePointsRecalculatorSPI underworkspace/SlackWeeklyLeaderboardTask(Java class) and its@ScheduledregistrationLeaderboardProperties.workspaceSlugs(field, config binding,application.ymlentry)Server-side schema (delegated to #1277, called out here):
workspace_membership.league_points,Workspace.leaderboard_schedule_*,Workspace.leaderboard_notification_*columns are dropped in fix(server): server-side feature-flag enforcement on dashboard endpoints #1277's migration; this sub-issue removes Java readers so columns have no remaining reader by the time fix(server): server-side feature-flag enforcement on dashboard endpoints #1277 drops them.Webapp (TypeScript) deletions:
LeagueIconcomponent + assetsScoringExplanationDialogcomponentAPI contract:
LeaderboardControllerroutes retain their paths for this sub-issue's duration (full surface deletion is refactor(server): extract ProfileActivityService from leaderboard internals #1272's scope); responses no longer includeleaguePoints,leagueChange, orrankfields produced by deleted services. A response-shape regression test asserts the absent fields.The
SlackMessageServicefrom #1246 is not deleted — it remains as a per-workspace utility used by other Slack-side surfaces. Only the leaderboard-task path through it is removed.Why
The leaderboard transformation epic's foundational decision is that ELO ranking + public weekly broadcasts contradict the SDT-aligned formative-feedback mentor thesis the rest of the product is built around. Deleting both mechanisms — not flagging them off — is the right operational move: a flag-gated leaderboard rots and leaks (the existing
WorkspaceFeatures.leaderboardEnabledis webapp-only and the API leaks the data regardless, captured as a separate fix in #1276); deleted code cannot leak. Combining both deletions into one PR keeps the cleanup atomic — the rest of the epic depends on the namespace being clear.Acceptance criteria
server/application-server/src/main/java/de/tum/in/www1/hephaestus/; build succeeds; no remaining import references the deleted symbolsLeaderboardSortType.LEAGUE_POINTSis removed; any controller / service method that accepted it as a parameter rejects requests carrying it with a structured 400; test asserts the failure shape is helpfulLeaguePointsRecalculatorSPI is removed; implementations in feature modules are deleted or simplified to no-op stubs in the same PRLeaguePointsRecalculatorandSlackWeeklyLeaderboardTask@Scheduledregistrations are gone; Spring starts cleanly with noUnknownConfigurationPropertywarning, no startup errorLeaderboardProperties.workspaceSlugsis removed from class +application.yml; no@ConfigurationPropertiesbinding remainsLeagueIcon,ScoringExplanationDialog, and any ELO-display webapp components are deleted; profile page asserts nodata-testidcontainingleagueis present (Playwright)de.tum.in.www1.hephaestus(coversLeaguePoints*,LeagueChange*,LeaguePointsConstants,SlackWeeklyLeaderboardTask)SlackMessageServicestill works (the survivor is intact)leaguePoints/leagueChange/rankfields, and that the weekly top-3 reviewers broadcast is removed; release notes frame the change as "replacing the broadcast with per-user reflection" via feat(server): MentorReflectionScheduler with per-user cadence and time of day #1258Tests to write
LeaderboardControllerendpoints asserting response shapes are stripped of deleted fields.SlackMessageServicesurvival assertion.Implementation notes
ProfileActivityService(refactor(server): extract ProfileActivityService from leaderboard internals #1272) being available. This sub-issue's deletion clears the namespace before extraction; sequencing chain puts this first.workspace_membership.league_pointsandWorkspace.leaderboard_*columns live until fix(server): server-side feature-flag enforcement on dashboard endpoints #1277; this sub-issue stops writing/reading them. Columns become orphaned but present until migration.application.ymlproperties underhephaestus.leaderboard.league-points.*are removed; remainingLeaderboardProperties.workspaceSlugsis handled here.league_points(e.g. historical seed) keep their existing rows; the column drop in fix(server): server-side feature-flag enforcement on dashboard endpoints #1277 snapshots populated values to the integration audit log (feat(server): append-only integration audit log #1218) before dropping.LeaderboardSortType.XP_TOTAL(or its successor in the new contract) as default during transition.Dependencies
Depends on #1246 shipping first (so #1050 is closed by routing, not deletion). Blocks #1272, #1277.