Skip to content

October 2026 Release 3 - #2574

Merged
jmgasper merged 48 commits into
masterfrom
dev
Oct 28, 2026
Merged

jmgasper merged 48 commits into
masterfrom
dev

Conversation

@jmgasper

Copy link
Copy Markdown
Collaborator
  • PM-5739
  • PM-6614
  • PM-6632
  • PM-6648
  • PM-6653
  • PM-6658
  • PM-6660
  • PM-6662
  • PM-6663
  • PM-6664
  • PM-6667
  • PM-6668
  • PM-6669
  • PM-6672

jmgasper and others added 30 commits October 21, 2026 11:55
What was broken
The monthly dashboards had no headline figures. The executive overview attachment opens each chart with the current month's value and its change from the previous month.

What was changed
Each chart now shows its current UTC month value in full, the change from the full previous month (relative %, or percentage points for percent charts) and a caption. Stacked charts headline their total and single-series charts their value. Flexible talent headlines each series, because its series can't be added. Pipeline charts grouped by close date that extend past this month are captioned "including expected closes". When nothing is recorded for the current month yet, such as revenue, which is recognized at month end, the latest month with data is headlined and named instead of showing "$0, -100%". The headlines are derived in the UI from existing API data, so the API is unchanged. The README and the page notice are updated.

Any added/updated tests
New tests cover stack totals, rises and falls, per-series figures, percentage points, an unknown or zero previous month, captions with and without expected closes, the latest-recorded-month fallback, a chart that ends before today, and rendering through the page for both pipeline date bases. All 152 Sales and Reports app tests pass. yarn lint and the production build pass; the build has only the existing warnings from other packages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What was broken
The opportunities challenge sidebar listed the manual review in Review
Style only as "Manual". Members could not open the scorecard the manual
review uses. The design asks for "Manual: Scorecard Link".

Root cause
The sidebar only knew the AI review config mode. It never read the
challenge review definition (challenge.reviewers), which holds the
member reviewer's scorecardId. The opportunities models did not type
those reviewer fields or the phase type id the reviewers point to.

What was changed
- Added challengeManualReviewScorecardId and
  challengeManualReviewScorecardUrl to challenge-detail.utils. They pick
  the member (non-AI) reviewer on the Review phase, falling back to
  Iterative Review, and build the public Review App scorecard URL
  (REVIEW_APP_URL/scorecard/<id>).
- ChallengeSidebar passes that URL to ReviewStyleSection. The Manual
  bullet now reads "Manual: Scorecard Link" with the existing tooltip.
  The link is only added when no AI review config exists.
- Typed ChallengeReviewer isMemberReview/phaseId/scorecardId and
  ChallengePhase phaseId.

Added/updated tests
- challenge-detail.utils.spec.ts covers Review phase selection, the
  Iterative Review fallback, id encoding, and ignoring AI and screening
  reviewers.
- ChallengeSidebar.spec.tsx covers the Manual scorecard link and checks
  that AI review modes do not get the link.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What was broken
The Marathon Match Tournament "Forums" link
(https://discussions.topcoder.com/categories/marathon-match-tournament-2026)
redirected to https://topcoder.com/opportunities/challenge/marathon-match-tournament-2026,
which shows "Competition not found". Every other retired discussions.topcoder.com
category URL was redirected the same way, and every old thread URL dropped
users on the forums home page instead of the migrated thread.

Root cause
The hand-published CloudFront viewer-request function
discussions-topcoder-retirement-redirect (distribution E1PCI0WVJ2HCEF) treated
every /categories/<code> URL as a challenge forum. Only challenge categories use
a challenge UUID as their Vanilla URL code. Community categories such as
marathon-match-tournament-2026 were migrated by the forums-api-v6 public import
to their own forums.topcoder.com categories, but the function had no mapping
for them or for migrated threads. The function source was not in any repo.

What was changed
- Added infrastructure/discussions-redirect/viewer-request.js, the corrected
  function source:
  - /categories/<challenge UUID> now opens the challenge forum tab
    (?tab=forum).
  - The 57 migrated Vanilla category URL codes open
    https://forums.topcoder.com/category/<id>, including /pN pages, trailing
    slashes, mixed case and percent-encoding.
  - The 1,357 migrated public /discussion/<id>/... threads open
    https://forums.topcoder.com/thread/<id>.
  - Everything else still goes to the forums home. Query parameters are still
    preserved.
  - Forums IDs are computed with the same deterministic hash as forums-api-v6
    publicImportId, so the function embeds only Vanilla IDs and stays under the
    10 KB CloudFront Functions limit.
- Added a README with the mapping source, the regeneration notes, and the
  deploy/rollback steps for the unmanaged production function.

Tests
- Added infrastructure/discussions-redirect/routing.test.cjs (node --test).
  It covers the tournament category, other categories, challenge categories,
  migrated and unmigrated threads, fallbacks, mapping integrity and the size
  limit. All 6 pass; all 6 fail against the current live function code.
- Checked against production forums data, read-only: all 57 categories and
  1,357 threads resolve to existing forums rows, and no unmigrated DiscussionID
  below 40,000 maps to a thread.
- Ran in the real cloudfront-js-2.0 runtime through a temporary, unattached
  dev-account function (deleted afterwards). Compute utilization was 12-15.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PM-6648: Link manual review scorecard in challenge Review Style
PM-6614: Redirect retired Vanilla forum URLs to migrated forums
PM-6632: Add headline figures to the monthly sales dashboards
- Rename the system-admin tab from "Machine Access · DEV" to "M2M".
- Scope catalog: replace Refresh with a green "Add scope" button that opens
  the create/repair form in a BaseModal dialog.
- Manage client: list the client's saved allowed scopes first, then the
  remaining scopes, each sorted by name, with a scope-name search filter.
- Manage client: "Copy client secret" fetches the current secret from the
  new audited backend route (POST clients/:id/secret) and writes it to the
  clipboard without rendering it, revealing it only if clipboard access is
  blocked. The one-time credential panel also gets a copy button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
M2M admin tab: scope dialog, allowed-first scope search, copy client secret
What was broken
The Opportunities challenge forum had no way to share a direct link to a
topic or a message. The open topic lived only in component state, so the
URL never changed, and a pasted challenge link always landed on the topic
list.

Root cause
ChallengeForum tracked the selected topic in local state that was never
read from or written to the URL. ChallengeDetailsPage only understood the
`tab` query parameter, so there was no URL that could reopen a topic or
point at a post.

What was changed
- Topic cards and posts in the Opportunities forum have a "Copy link"
  action. It copies `…/challenge/<id>?tab=forum&topicId=<topic>` for a
  topic, and adds `&postId=<post>` for a message. The link keeps the
  current host and path, so TopGear and subdomain hosts link back to
  themselves. A toast confirms the copy or reports clipboard failures.
- Opening a pasted link opens the Forum tab on that topic and marks it
  read. A message link also scrolls to the post and outlines it in the
  forum teal.
- The Forum tab writes the open topic back to `topicId` (replace
  navigation), so the address bar also links to the open topic. Leaving
  the Forum tab drops `topicId`/`postId`.
- New helpers `challengeForumLink` and
  `challengeForumLinkTargetFromSearch` in challenge-detail-route.utils.
- New 20px teal `copyLink` forum icon. It is the existing Figma link
  glyph without its plus.
- The shared ForumTopicCard/ForumTopicView only show the action when a
  callback is passed, so the public forums app is unchanged.

Added/updated tests
- challenge-detail-route.utils.spec: link building and query parsing.
- ChallengeForum.spec: copying topic and message links, clipboard
  failure toasts, and opening a linked topic that scrolls to and
  highlights the linked post and reports topic changes.
- ChallengeDetailsPage.flows.spec: a shared link reaches the forum, the
  open topic is kept in the URL, and it is dropped when leaving the
  Forum tab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What was broken
The work app's Marathon Match scorer settings had no memory setting, so a
copilot or manager could not run a match with anything other than the
default scorer memory.

Root cause
The scorer config editor, model and service did not expose the
memoryLimit setting that the marathon-match API now supports
(marathon-match-api-v6 PM-5739).

What was changed
- Added a "Memory Limit (MB)" number field to Scorer Settings, after
  Compile Timeout. New configs are filled from the API default
  (GET /challenge/defaults memoryLimit, 2048 MB, the current value for all
  MMs). Saved configs without a memory limit show that default too, and it
  does not count as an unsaved change.
- The field must be an integer of at least 512 MB. The API returns a
  clear error for sizes that Fargate does not support for the task
  definition CPU.
- The memory limit is sent on create and update, read from config
  responses (null when unset), and included in unsaved-change detection.
- Updated model docs and added JSDoc for mapConfigToDraft and
  normalizeMarathonMatchDefaults.

Added/updated tests
- MarathonMatchScorerSection.spec.tsx: field defaults to 2048, an empty
  value shows the validation error, an edited value is saved, and a saved
  config without a memory limit shows the default without unsaved changes.
- marathon-match.service.spec.ts: defaults memoryLimit, null memoryLimit
  for configs without one, and memoryLimit sent on update.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PM-5739: add memory limit field to MM scorer settings
PM-6653: Add copy link for forum topics and messages
…-dev

Show the full April–March fiscal year in sales dashboards -> dev
PM-6660: Update pipeline bookings, filters and column order
…M-6664_wallet-admin-duplicate-payment-report
…duplicate-payment-report

PM-6664 wallet admin duplicate payment report
PM-6667: Update sales dashboards and customer payment reporting
Revert the UI introduced in #2546 and refined in #2549 while the identity provider choice is reconsidered.

Preserve the complete implementation, including scope management and secret copying, on archive/keycloak-m2m-admin. Revert this removal commit to restore the feature.
Remove Keycloak M2M administration -> dev
PM-6668: Add annual totals and complete customer tables
vas3a and others added 16 commits October 27, 2026 08:06
…le-payment

PM-6664 - indicate double payments in wallet admin
…et-entry-delete

PM-6662 allow timesheet entry delete
…wups-dev

Update sales fiscal-year titles, date defaults and customer totals
PM-6672: consolidate Sales dashboards, filters and customer totals
PM-6672: show selectable breakdowns and expandable customer reports
…ts-page

PM-6669 - enhancements for assignments page
@jmgasper
jmgasper requested a review from kkartunov as a code owner October 28, 2026 21:53
Preserve sales dashboard headlines, tests, and documentation alongside the shared totals and customer reporting changes. Bring in the remaining master updates without changing their contents.
Resolve release PR #2574 conflicts by merging master into dev
@jmgasper jmgasper reopened this Oct 28, 2026
@jmgasper
jmgasper merged commit fa94b45 into master Oct 28, 2026
7 of 9 checks passed
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