Skip to content

removed mooclet infrastructure, implemented native thompson-sampling … - #3304

Draft
danoswaltCL wants to merge 1 commit into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 1 commit into
devfrom
poc/native-thompson-sampling-experiments

Conversation

@danoswaltCL

Copy link
Copy Markdown
Collaborator

…algorithm, added weight estimation mechanism

…algorithm, added weight estimation mechanism

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

Copilot AI 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.

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_types and 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;
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