removed mooclet infrastructure, implemented native thompson-sampling … - #3304
Draft
danoswaltCL wants to merge 1 commit into
Draft
removed mooclet infrastructure, implemented native thompson-sampling …#3304danoswaltCL wants to merge 1 commit into
danoswaltCL wants to merge 1 commit into
Conversation
…algorithm, added weight estimation mechanism Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR completes the migration away from the external Mooclet integration by implementing native Thompson Sampling end-to-end (backend, frontend, shared types, and client SDKs), and adds an “estimated weight” mechanism in reward summaries.
Changes:
- Replaced Mooclet adaptive experiment infrastructure with native Thompson Sampling services, entities, migrations, and endpoints.
- Updated frontend to use
thompsonSamplingConfig, added reward summary UI column (estimatedWeight) and updated labels/tooltips. - Updated shared
upgrade_typesand client libraries (JS/Python) to reflect the new reward behavior and removed Mooclet artifacts/config flags.
Reviewed changes
Copilot reviewed 93 out of 93 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| postman/ClientAPI.postman_collection.json | Update reward endpoint description |
| packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.ts | Remove Mooclet TS DTO |
| packages/types/src/Mooclet/MoocletPolicyParametersDTO.ts | Remove Mooclet policy base DTO |
| packages/types/src/Mooclet/index.ts | Remove Mooclet exports/constants |
| packages/types/src/index.ts | Re-export moved experiment interfaces |
| packages/types/src/Experiment/interfaces.ts | Add priors/reward types + estimatedWeight |
| packages/types/src/Experiment/enums.ts | Rename algorithm enum; remove Mooclet errors |
| packages/types/CLAUDE.md | Remove Mooclet folder note |
| packages/frontend/projects/upgrade/src/environments/environment.ts | Remove moocletToggle |
| packages/frontend/projects/upgrade/src/environments/environment.staging.ts | Remove moocletToggle |
| packages/frontend/projects/upgrade/src/environments/environment.qa.ts | Remove moocletToggle |
| packages/frontend/projects/upgrade/src/environments/environment.prod.ts | Remove moocletToggle |
| packages/frontend/projects/upgrade/src/environments/environment.local.example.ts | Remove moocletToggle |
| packages/frontend/projects/upgrade/src/environments/environment.demo.prod.ts | Remove moocletToggle |
| packages/frontend/projects/upgrade/src/environments/environment.bsnl.ts | Remove moocletToggle |
| packages/frontend/projects/upgrade/src/environments/environment-types.ts | Remove moocletToggle; rename rewards endpoint |
| packages/frontend/projects/upgrade/src/assets/i18n/en.json | Rename TS labels; add estimated weight strings |
| packages/frontend/.../ts-configurable-reward-count-table.component.ts | Add estimatedWeight column + tooltip module |
| packages/frontend/.../ts-configurable-reward-count-table.component.scss | Add estimated-weight-column styling |
| packages/frontend/.../ts-configurable-reward-count-table.component.html | Render estimated weight column |
| packages/frontend/.../enrollment-condition-expandable-row.component.ts | Swap helper service to Thompson Sampling |
| packages/frontend/.../enrollment-condition-expandable-row.component.html | Rename mooclet checks to TS checks |
| packages/frontend/.../experiment-details-page-content.component.ts | Show reward feedback for TS algorithm |
| packages/frontend/.../experiment-conditions-table.component.ts | Rename input; switch TS column set |
| packages/frontend/.../experiment-conditions-table.component.html | Rename bindings; TS-specific N/A rendering |
| packages/frontend/.../experiment-conditions-section-card.component.ts | Swap helper; use thompsonSamplingConfig priors |
| packages/frontend/.../experiment-conditions-section-card.component.html | Bind to thompsonSamplingConfig priors |
| packages/frontend/.../upsert-experiment-modal.component.ts | Replace mooclet params with thompsonSamplingConfig |
| packages/frontend/.../upsert-experiment-modal.component.html | Render TS form for TS algorithm |
| packages/frontend/.../ts-configurable-policy-parameters-form.component.ts | Convert form to TS config fields |
| packages/frontend/.../ts-configurable-policy-parameters-form.component.html | Update control names for renamed fields |
| packages/frontend/.../edit-condition-prior-modal.component.ts | Use ThompsonSamplingHelperService validators |
| packages/frontend/.../thompson-sampling-helper.service.ts | New TS helper + validators + overview formatting |
| packages/frontend/.../experiments.selectors.ts | Use TS overview formatter; rename disabled field |
| packages/frontend/.../experiments.model.ts | Add ThompsonSamplingConfigDTO + overview labels rename |
| packages/frontend/.../experiments.effects.ts | Fetch rewards summary via new data service method |
| packages/frontend/.../experiments.effects.spec.ts | Remove old rewards effect tests |
| packages/frontend/.../mooclet-helper.service.ts | Remove Mooclet helper service |
| packages/frontend/.../mooclet-helper.service.spec.ts | Remove Mooclet helper service tests |
| packages/frontend/.../experiments.service.ts | Update prior update path to thompsonSamplingConfig.priors |
| packages/frontend/.../experiments.data.service.ts | Add fetchRewardsDataForExperiment; remove mooclet fetch |
| packages/frontend/.../api-endpoints.constants.ts | Rename rewards endpoint constant |
| packages/backend/test/unit/services/ThompsonSamplingService.test.ts | Add TS selection + weight estimation tests |
| packages/backend/test/unit/services/MoocletDataService.test.ts | Remove Mooclet data service tests |
| packages/backend/test/unit/services/ExperimentService.test.ts | Remove Mooclet deps from unit wiring/comments |
| packages/backend/test/unit/services/ExperimentAssignmentService.test.ts | Remove Mooclet mock; add TS placeholders |
| packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.ts | Remove Mooclet rewards mock |
| packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.ts | Remove Mooclet experiment mock |
| packages/backend/test/unit/controllers/ExperimentController.test.ts | Remove Mooclet cases; add TS crud placeholder |
| packages/backend/src/types/Mooclet.ts | Remove Mooclet type definitions |
| packages/backend/src/env.ts | Remove mooclets env block |
| packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.ts | Bootstrap missing TS configs/posteriors |
| packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.ts | Drop Mooclet tables; migrate enum value |
| packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.ts | Create TS tables + enum addition |
| packages/backend/src/api/services/ThompsonSamplingService.ts | New TS selection + weight estimation engine |
| packages/backend/src/api/services/ThompsonSamplingRewardService.ts | New native reward recording + posterior increment |
| packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.ts | New TS config CRUD + rewards summary |
| packages/backend/src/api/services/MoocletRewardsService.ts | Remove Mooclet rewards service |
| packages/backend/src/api/services/MoocletDataService.ts | Remove Mooclet proxy/data service |
| packages/backend/src/api/services/ImportExportService.ts | Remove Mooclet import/export paths |
| packages/backend/src/api/services/ExperimentService.ts | Remove Mooclet validation/transaction notes |
| packages/backend/src/api/services/ExperimentAssignmentService.ts | Replace Mooclet assignment with TS assignment |
| packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.ts | New TS reward repository |
| packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.ts | New TS config repository queries |
| packages/backend/src/api/repositories/MoocletExperimentRefRepository.ts | Remove Mooclet ref repository |
| packages/backend/src/api/repositories/ConditionPosteriorStateRepository.ts | New posterior state repository |
| packages/backend/src/api/models/ThompsonSamplingReward.ts | New reward entity |
| packages/backend/src/api/models/ThompsonSamplingExperimentConfig.ts | New TS config entity |
| packages/backend/src/api/models/MoocletVersionConditionMap.ts | Remove Mooclet mapping entity |
| packages/backend/src/api/models/MoocletExperimentRef.ts | Remove Mooclet ref entity |
| packages/backend/src/api/models/ConditionPosteriorState.ts | New posterior state entity |
| packages/backend/src/api/middlewares/ErrorHandlerMiddleware.ts | Remove Mooclet error cases |
| packages/backend/src/api/errors/MoocletError.ts | Remove Mooclet error type |
| packages/backend/src/api/DTO/ExperimentDTO.ts | Replace moocletPolicyParameters with thompsonSamplingConfig |
| packages/backend/src/api/controllers/ExperimentController.ts | Create/update TS config; add rewards summary endpoint |
| packages/backend/src/api/controllers/ExperimentClientController.v6.ts | Rewire /v6/reward to native TS reward service |
| packages/backend/rest-client-vscode/MoocletAPI.http | Remove Mooclet REST client doc |
| packages/backend/CLAUDE.md | Remove Mooclet transaction notes |
| packages/backend/.env.example | Remove MOOCLETS_* env vars |
| packages/backend/.env.docker.local.example | Remove MOOCLETS_* env vars |
| clientlibs/python/tests/test_client.py | Update reward response expectations |
| clientlibs/python/tests/test_api_service.py | Update reward response expectations |
| clientlibs/python/src/upgrade_client_lib/types/responses.py | Remove RewardDetails from response model |
| clientlibs/python/src/upgrade_client_lib/types/init.py | Stop exporting RewardDetails |
| clientlibs/python/src/upgrade_client_lib/client.py | Update reward docstring wording |
| clientlibs/python/BUILD_PLAN.md | Update reward response contract |
| clientlibs/js/src/UpGradeClient/UpgradeClient.ts | Update reward docstring wording |
| clientlibs/js/src/types/Interfaces.ts | Remove reward details from response interface |
| CLAUDE.md | Document native TS migration plan/progress |
| .claude/skills/setup-perftrace/SKILL.md | Update /v6/reward instrumentation reference |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+59
to
+68
| public async updateConfig(experimentId: string, params: ThompsonSamplingConfigParams): Promise<void> { | ||
| await this.configRepository.update( | ||
| { experimentId }, | ||
| { | ||
| warmupThreshold: params.warmupThreshold ?? null, | ||
| minimumDrawDifference: params.minimumDrawDifference ?? null, | ||
| batchSize: params.batchSize ?? null, | ||
| } | ||
| ); | ||
| } |
Comment on lines
+1971
to
+1983
| private async attachThompsonSamplingConfig(experiment: ExperimentDTO): Promise<ExperimentDTO> { | ||
| if (experiment?.assignmentAlgorithm === ASSIGNMENT_ALGORITHM.THOMPSON_SAMPLING) { | ||
| const config = await this.thompsonSamplingCrudService.getConfigForExperiment(experiment.id); | ||
| if (config) { | ||
| experiment.thompsonSamplingConfig = { | ||
| warmupThreshold: config.warmupThreshold, | ||
| minimumDrawDifference: config.minimumDrawDifference, | ||
| batchSize: config.batchSize, | ||
| }; | ||
| } | ||
| } | ||
| return experiment; | ||
| } |
Comment on lines
+505
to
+509
| @IsOptional() | ||
| public thompsonSamplingConfig?: { | ||
| warmupThreshold?: number; | ||
| minimumDrawDifference?: number; | ||
| batchSize?: number; |
| priors[state.conditionId] = { success: state.priorSuccess, failure: state.priorFailure }; | ||
| }); | ||
|
|
||
| const totalEnrollments = config.conditionPosteriorStates.reduce((sum, s) => sum + s.totalCount, 0); |
Comment on lines
1372
to
1375
| tick(0); | ||
| })); | ||
| }); | ||
|
|
||
| describe('fetchRewardsDataForExperiment$', () => { | ||
| it('should dispatch actionFetchRewardsDataForExperimentSuccess on successful fetch', fakeAsync(() => { | ||
| const experimentId = 'test-experiment-123'; | ||
| const mockRewardsSummary = [ | ||
| { | ||
| conditionCode: 'Control', | ||
| successes: 10, | ||
| failures: 5, | ||
| total: 15, | ||
| successRate: '66.7%', | ||
| order: 0, | ||
| }, | ||
| { | ||
| conditionCode: 'Treatment', | ||
| successes: 8, | ||
| failures: 7, | ||
| total: 15, | ||
| successRate: '53.3%', | ||
| order: 1, | ||
| }, | ||
| ]; | ||
|
|
||
| experimentDataService.fetchMoocletRewardsDataForExperiment = jest.fn().mockReturnValue(of(mockRewardsSummary)); | ||
|
|
||
| const expectedAction = actionFetchRewardsDataForExperimentSuccess({ | ||
| experimentId, | ||
| rewardsSummary: mockRewardsSummary, | ||
| }); | ||
|
|
||
| service.fetchRewardsDataForExperiment$.subscribe((resultingAction) => { | ||
| expect(resultingAction).toEqual(expectedAction); | ||
| }); | ||
|
|
||
| actions$.next(actionFetchRewardsDataForExperiment({ experimentId })); | ||
|
|
||
| tick(0); | ||
| })); | ||
|
|
||
| it('should dispatch actionFetchRewardsDataForExperimentFailure on fetch error', fakeAsync(() => { | ||
| const experimentId = 'test-experiment-123'; | ||
| const error = new Error('API error'); | ||
|
|
||
| experimentDataService.fetchMoocletRewardsDataForExperiment = jest.fn().mockReturnValue(throwError(error)); | ||
|
|
||
| const expectedAction = actionFetchRewardsDataForExperimentFailure({ error }); | ||
|
|
||
| service.fetchRewardsDataForExperiment$.subscribe((resultingAction) => { | ||
| expect(resultingAction).toEqual(expectedAction); | ||
| }); | ||
|
|
||
| actions$.next(actionFetchRewardsDataForExperiment({ experimentId })); | ||
|
|
||
| tick(0); | ||
| })); | ||
|
|
||
| it('should call experimentDataService with correct experimentId', fakeAsync(() => { | ||
| const experimentId = 'test-experiment-456'; | ||
| const mockRewardsSummary = []; | ||
|
|
||
| experimentDataService.fetchMoocletRewardsDataForExperiment = jest.fn().mockReturnValue(of(mockRewardsSummary)); | ||
|
|
||
| service.fetchRewardsDataForExperiment$.subscribe(() => { | ||
| expect(experimentDataService.fetchMoocletRewardsDataForExperiment).toHaveBeenCalledWith(experimentId); | ||
| }); | ||
|
|
||
| actions$.next(actionFetchRewardsDataForExperiment({ experimentId })); | ||
|
|
||
| tick(0); | ||
| })); | ||
| }); | ||
| }); |
| import { MatFormFieldModule } from '@angular/material/form-field'; | ||
| import { MatInputModule } from '@angular/material/input'; | ||
| import { TranslateModule } from '@ngx-translate/core'; | ||
| import { BehaviorSubject, map, Observable, of, startWith, Subject, Subscription } from 'rxjs'; |
| const hasMoocletPolicyParameters = !!experiment.moocletPolicyParameters; | ||
| const isTSConfigurable = experiment.assignmentAlgorithm === ASSIGNMENT_ALGORITHM.MOOCLET_TS_CONFIGURABLE; | ||
| return isMoocletEnabled && hasMoocletPolicyParameters && isTSConfigurable; | ||
| return experiment.assignmentAlgorithm === ASSIGNMENT_ALGORITHM.THOMPSON_SAMPLING; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…algorithm, added weight estimation mechanism