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

Draft
danoswaltCL wants to merge 4 commits into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 4 commits 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>

CopilotAI 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
FileDescription
postman/ClientAPI.postman_collection.jsonUpdate reward endpoint description
packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.tsRemove Mooclet TS DTO
packages/types/src/Mooclet/MoocletPolicyParametersDTO.tsRemove Mooclet policy base DTO
packages/types/src/Mooclet/index.tsRemove Mooclet exports/constants
packages/types/src/index.tsRe-export moved experiment interfaces
packages/types/src/Experiment/interfaces.tsAdd priors/reward types + estimatedWeight
packages/types/src/Experiment/enums.tsRename algorithm enum; remove Mooclet errors
packages/types/CLAUDE.mdRemove Mooclet folder note
packages/frontend/projects/upgrade/src/environments/environment.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.staging.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.qa.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.local.example.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.demo.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.bsnl.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment-types.tsRemove moocletToggle; rename rewards endpoint
packages/frontend/projects/upgrade/src/assets/i18n/en.jsonRename TS labels; add estimated weight strings
packages/frontend/.../ts-configurable-reward-count-table.component.tsAdd estimatedWeight column + tooltip module
packages/frontend/.../ts-configurable-reward-count-table.component.scssAdd estimated-weight-column styling
packages/frontend/.../ts-configurable-reward-count-table.component.htmlRender estimated weight column
packages/frontend/.../enrollment-condition-expandable-row.component.tsSwap helper service to Thompson Sampling
packages/frontend/.../enrollment-condition-expandable-row.component.htmlRename mooclet checks to TS checks
packages/frontend/.../experiment-details-page-content.component.tsShow reward feedback for TS algorithm
packages/frontend/.../experiment-conditions-table.component.tsRename input; switch TS column set
packages/frontend/.../experiment-conditions-table.component.htmlRename bindings; TS-specific N/A rendering
packages/frontend/.../experiment-conditions-section-card.component.tsSwap helper; use thompsonSamplingConfig priors
packages/frontend/.../experiment-conditions-section-card.component.htmlBind to thompsonSamplingConfig priors
packages/frontend/.../upsert-experiment-modal.component.tsReplace mooclet params with thompsonSamplingConfig
packages/frontend/.../upsert-experiment-modal.component.htmlRender TS form for TS algorithm
packages/frontend/.../ts-configurable-policy-parameters-form.component.tsConvert form to TS config fields
packages/frontend/.../ts-configurable-policy-parameters-form.component.htmlUpdate control names for renamed fields
packages/frontend/.../edit-condition-prior-modal.component.tsUse ThompsonSamplingHelperService validators
packages/frontend/.../thompson-sampling-helper.service.tsNew TS helper + validators + overview formatting
packages/frontend/.../experiments.selectors.tsUse TS overview formatter; rename disabled field
packages/frontend/.../experiments.model.tsAdd ThompsonSamplingConfigDTO + overview labels rename
packages/frontend/.../experiments.effects.tsFetch rewards summary via new data service method
packages/frontend/.../experiments.effects.spec.tsRemove old rewards effect tests
packages/frontend/.../mooclet-helper.service.tsRemove Mooclet helper service
packages/frontend/.../mooclet-helper.service.spec.tsRemove Mooclet helper service tests
packages/frontend/.../experiments.service.tsUpdate prior update path to thompsonSamplingConfig.priors
packages/frontend/.../experiments.data.service.tsAdd fetchRewardsDataForExperiment; remove mooclet fetch
packages/frontend/.../api-endpoints.constants.tsRename rewards endpoint constant
packages/backend/test/unit/services/ThompsonSamplingService.test.tsAdd TS selection + weight estimation tests
packages/backend/test/unit/services/MoocletDataService.test.tsRemove Mooclet data service tests
packages/backend/test/unit/services/ExperimentService.test.tsRemove Mooclet deps from unit wiring/comments
packages/backend/test/unit/services/ExperimentAssignmentService.test.tsRemove Mooclet mock; add TS placeholders
packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.tsRemove Mooclet rewards mock
packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.tsRemove Mooclet experiment mock
packages/backend/test/unit/controllers/ExperimentController.test.tsRemove Mooclet cases; add TS crud placeholder
packages/backend/src/types/Mooclet.tsRemove Mooclet type definitions
packages/backend/src/env.tsRemove mooclets env block
packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.tsBootstrap missing TS configs/posteriors
packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.tsDrop Mooclet tables; migrate enum value
packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.tsCreate TS tables + enum addition
packages/backend/src/api/services/ThompsonSamplingService.tsNew TS selection + weight estimation engine
packages/backend/src/api/services/ThompsonSamplingRewardService.tsNew native reward recording + posterior increment
packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.tsNew TS config CRUD + rewards summary
packages/backend/src/api/services/MoocletRewardsService.tsRemove Mooclet rewards service
packages/backend/src/api/services/MoocletDataService.tsRemove Mooclet proxy/data service
packages/backend/src/api/services/ImportExportService.tsRemove Mooclet import/export paths
packages/backend/src/api/services/ExperimentService.tsRemove Mooclet validation/transaction notes
packages/backend/src/api/services/ExperimentAssignmentService.tsReplace Mooclet assignment with TS assignment
packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.tsNew TS reward repository
packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.tsNew TS config repository queries
packages/backend/src/api/repositories/MoocletExperimentRefRepository.tsRemove Mooclet ref repository
packages/backend/src/api/repositories/ConditionPosteriorStateRepository.tsNew posterior state repository
packages/backend/src/api/models/ThompsonSamplingReward.tsNew reward entity
packages/backend/src/api/models/ThompsonSamplingExperimentConfig.tsNew TS config entity
packages/backend/src/api/models/MoocletVersionConditionMap.tsRemove Mooclet mapping entity
packages/backend/src/api/models/MoocletExperimentRef.tsRemove Mooclet ref entity
packages/backend/src/api/models/ConditionPosteriorState.tsNew posterior state entity
packages/backend/src/api/middlewares/ErrorHandlerMiddleware.tsRemove Mooclet error cases
packages/backend/src/api/errors/MoocletError.tsRemove Mooclet error type
packages/backend/src/api/DTO/ExperimentDTO.tsReplace moocletPolicyParameters with thompsonSamplingConfig
packages/backend/src/api/controllers/ExperimentController.tsCreate/update TS config; add rewards summary endpoint
packages/backend/src/api/controllers/ExperimentClientController.v6.tsRewire /v6/reward to native TS reward service
packages/backend/rest-client-vscode/MoocletAPI.httpRemove Mooclet REST client doc
packages/backend/CLAUDE.mdRemove Mooclet transaction notes
packages/backend/.env.exampleRemove MOOCLETS_* env vars
packages/backend/.env.docker.local.exampleRemove MOOCLETS_* env vars
clientlibs/python/tests/test_client.pyUpdate reward response expectations
clientlibs/python/tests/test_api_service.pyUpdate reward response expectations
clientlibs/python/src/upgrade_client_lib/types/responses.pyRemove RewardDetails from response model
clientlibs/python/src/upgrade_client_lib/types/init.pyStop exporting RewardDetails
clientlibs/python/src/upgrade_client_lib/client.pyUpdate reward docstring wording
clientlibs/python/BUILD_PLAN.mdUpdate reward response contract
clientlibs/js/src/UpGradeClient/UpgradeClient.tsUpdate reward docstring wording
clientlibs/js/src/types/Interfaces.tsRemove reward details from response interface
CLAUDE.mdDocument native TS migration plan/progress
.claude/skills/setup-perftrace/SKILL.mdUpdate /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 +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);
}));
});
});
danoswaltCLand others added 3 commits September 1, 2026 16:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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

@danoswaltCL
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

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

Draft
danoswaltCL wants to merge 4 commits into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 4 commits 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>

CopilotAI 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
FileDescription
postman/ClientAPI.postman_collection.jsonUpdate reward endpoint description
packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.tsRemove Mooclet TS DTO
packages/types/src/Mooclet/MoocletPolicyParametersDTO.tsRemove Mooclet policy base DTO
packages/types/src/Mooclet/index.tsRemove Mooclet exports/constants
packages/types/src/index.tsRe-export moved experiment interfaces
packages/types/src/Experiment/interfaces.tsAdd priors/reward types + estimatedWeight
packages/types/src/Experiment/enums.tsRename algorithm enum; remove Mooclet errors
packages/types/CLAUDE.mdRemove Mooclet folder note
packages/frontend/projects/upgrade/src/environments/environment.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.staging.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.qa.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.local.example.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.demo.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.bsnl.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment-types.tsRemove moocletToggle; rename rewards endpoint
packages/frontend/projects/upgrade/src/assets/i18n/en.jsonRename TS labels; add estimated weight strings
packages/frontend/.../ts-configurable-reward-count-table.component.tsAdd estimatedWeight column + tooltip module
packages/frontend/.../ts-configurable-reward-count-table.component.scssAdd estimated-weight-column styling
packages/frontend/.../ts-configurable-reward-count-table.component.htmlRender estimated weight column
packages/frontend/.../enrollment-condition-expandable-row.component.tsSwap helper service to Thompson Sampling
packages/frontend/.../enrollment-condition-expandable-row.component.htmlRename mooclet checks to TS checks
packages/frontend/.../experiment-details-page-content.component.tsShow reward feedback for TS algorithm
packages/frontend/.../experiment-conditions-table.component.tsRename input; switch TS column set
packages/frontend/.../experiment-conditions-table.component.htmlRename bindings; TS-specific N/A rendering
packages/frontend/.../experiment-conditions-section-card.component.tsSwap helper; use thompsonSamplingConfig priors
packages/frontend/.../experiment-conditions-section-card.component.htmlBind to thompsonSamplingConfig priors
packages/frontend/.../upsert-experiment-modal.component.tsReplace mooclet params with thompsonSamplingConfig
packages/frontend/.../upsert-experiment-modal.component.htmlRender TS form for TS algorithm
packages/frontend/.../ts-configurable-policy-parameters-form.component.tsConvert form to TS config fields
packages/frontend/.../ts-configurable-policy-parameters-form.component.htmlUpdate control names for renamed fields
packages/frontend/.../edit-condition-prior-modal.component.tsUse ThompsonSamplingHelperService validators
packages/frontend/.../thompson-sampling-helper.service.tsNew TS helper + validators + overview formatting
packages/frontend/.../experiments.selectors.tsUse TS overview formatter; rename disabled field
packages/frontend/.../experiments.model.tsAdd ThompsonSamplingConfigDTO + overview labels rename
packages/frontend/.../experiments.effects.tsFetch rewards summary via new data service method
packages/frontend/.../experiments.effects.spec.tsRemove old rewards effect tests
packages/frontend/.../mooclet-helper.service.tsRemove Mooclet helper service
packages/frontend/.../mooclet-helper.service.spec.tsRemove Mooclet helper service tests
packages/frontend/.../experiments.service.tsUpdate prior update path to thompsonSamplingConfig.priors
packages/frontend/.../experiments.data.service.tsAdd fetchRewardsDataForExperiment; remove mooclet fetch
packages/frontend/.../api-endpoints.constants.tsRename rewards endpoint constant
packages/backend/test/unit/services/ThompsonSamplingService.test.tsAdd TS selection + weight estimation tests
packages/backend/test/unit/services/MoocletDataService.test.tsRemove Mooclet data service tests
packages/backend/test/unit/services/ExperimentService.test.tsRemove Mooclet deps from unit wiring/comments
packages/backend/test/unit/services/ExperimentAssignmentService.test.tsRemove Mooclet mock; add TS placeholders
packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.tsRemove Mooclet rewards mock
packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.tsRemove Mooclet experiment mock
packages/backend/test/unit/controllers/ExperimentController.test.tsRemove Mooclet cases; add TS crud placeholder
packages/backend/src/types/Mooclet.tsRemove Mooclet type definitions
packages/backend/src/env.tsRemove mooclets env block
packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.tsBootstrap missing TS configs/posteriors
packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.tsDrop Mooclet tables; migrate enum value
packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.tsCreate TS tables + enum addition
packages/backend/src/api/services/ThompsonSamplingService.tsNew TS selection + weight estimation engine
packages/backend/src/api/services/ThompsonSamplingRewardService.tsNew native reward recording + posterior increment
packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.tsNew TS config CRUD + rewards summary
packages/backend/src/api/services/MoocletRewardsService.tsRemove Mooclet rewards service
packages/backend/src/api/services/MoocletDataService.tsRemove Mooclet proxy/data service
packages/backend/src/api/services/ImportExportService.tsRemove Mooclet import/export paths
packages/backend/src/api/services/ExperimentService.tsRemove Mooclet validation/transaction notes
packages/backend/src/api/services/ExperimentAssignmentService.tsReplace Mooclet assignment with TS assignment
packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.tsNew TS reward repository
packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.tsNew TS config repository queries
packages/backend/src/api/repositories/MoocletExperimentRefRepository.tsRemove Mooclet ref repository
packages/backend/src/api/repositories/ConditionPosteriorStateRepository.tsNew posterior state repository
packages/backend/src/api/models/ThompsonSamplingReward.tsNew reward entity
packages/backend/src/api/models/ThompsonSamplingExperimentConfig.tsNew TS config entity
packages/backend/src/api/models/MoocletVersionConditionMap.tsRemove Mooclet mapping entity
packages/backend/src/api/models/MoocletExperimentRef.tsRemove Mooclet ref entity
packages/backend/src/api/models/ConditionPosteriorState.tsNew posterior state entity
packages/backend/src/api/middlewares/ErrorHandlerMiddleware.tsRemove Mooclet error cases
packages/backend/src/api/errors/MoocletError.tsRemove Mooclet error type
packages/backend/src/api/DTO/ExperimentDTO.tsReplace moocletPolicyParameters with thompsonSamplingConfig
packages/backend/src/api/controllers/ExperimentController.tsCreate/update TS config; add rewards summary endpoint
packages/backend/src/api/controllers/ExperimentClientController.v6.tsRewire /v6/reward to native TS reward service
packages/backend/rest-client-vscode/MoocletAPI.httpRemove Mooclet REST client doc
packages/backend/CLAUDE.mdRemove Mooclet transaction notes
packages/backend/.env.exampleRemove MOOCLETS_* env vars
packages/backend/.env.docker.local.exampleRemove MOOCLETS_* env vars
clientlibs/python/tests/test_client.pyUpdate reward response expectations
clientlibs/python/tests/test_api_service.pyUpdate reward response expectations
clientlibs/python/src/upgrade_client_lib/types/responses.pyRemove RewardDetails from response model
clientlibs/python/src/upgrade_client_lib/types/init.pyStop exporting RewardDetails
clientlibs/python/src/upgrade_client_lib/client.pyUpdate reward docstring wording
clientlibs/python/BUILD_PLAN.mdUpdate reward response contract
clientlibs/js/src/UpGradeClient/UpgradeClient.tsUpdate reward docstring wording
clientlibs/js/src/types/Interfaces.tsRemove reward details from response interface
CLAUDE.mdDocument native TS migration plan/progress
.claude/skills/setup-perftrace/SKILL.mdUpdate /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 +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);
}));
});
});
danoswaltCLand others added 3 commits September 1, 2026 16:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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

@danoswaltCL
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Draft
danoswaltCL wants to merge 4 commits into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 4 commits 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>

CopilotAI 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
FileDescription
postman/ClientAPI.postman_collection.jsonUpdate reward endpoint description
packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.tsRemove Mooclet TS DTO
packages/types/src/Mooclet/MoocletPolicyParametersDTO.tsRemove Mooclet policy base DTO
packages/types/src/Mooclet/index.tsRemove Mooclet exports/constants
packages/types/src/index.tsRe-export moved experiment interfaces
packages/types/src/Experiment/interfaces.tsAdd priors/reward types + estimatedWeight
packages/types/src/Experiment/enums.tsRename algorithm enum; remove Mooclet errors
packages/types/CLAUDE.mdRemove Mooclet folder note
packages/frontend/projects/upgrade/src/environments/environment.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.staging.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.qa.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.local.example.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.demo.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.bsnl.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment-types.tsRemove moocletToggle; rename rewards endpoint
packages/frontend/projects/upgrade/src/assets/i18n/en.jsonRename TS labels; add estimated weight strings
packages/frontend/.../ts-configurable-reward-count-table.component.tsAdd estimatedWeight column + tooltip module
packages/frontend/.../ts-configurable-reward-count-table.component.scssAdd estimated-weight-column styling
packages/frontend/.../ts-configurable-reward-count-table.component.htmlRender estimated weight column
packages/frontend/.../enrollment-condition-expandable-row.component.tsSwap helper service to Thompson Sampling
packages/frontend/.../enrollment-condition-expandable-row.component.htmlRename mooclet checks to TS checks
packages/frontend/.../experiment-details-page-content.component.tsShow reward feedback for TS algorithm
packages/frontend/.../experiment-conditions-table.component.tsRename input; switch TS column set
packages/frontend/.../experiment-conditions-table.component.htmlRename bindings; TS-specific N/A rendering
packages/frontend/.../experiment-conditions-section-card.component.tsSwap helper; use thompsonSamplingConfig priors
packages/frontend/.../experiment-conditions-section-card.component.htmlBind to thompsonSamplingConfig priors
packages/frontend/.../upsert-experiment-modal.component.tsReplace mooclet params with thompsonSamplingConfig
packages/frontend/.../upsert-experiment-modal.component.htmlRender TS form for TS algorithm
packages/frontend/.../ts-configurable-policy-parameters-form.component.tsConvert form to TS config fields
packages/frontend/.../ts-configurable-policy-parameters-form.component.htmlUpdate control names for renamed fields
packages/frontend/.../edit-condition-prior-modal.component.tsUse ThompsonSamplingHelperService validators
packages/frontend/.../thompson-sampling-helper.service.tsNew TS helper + validators + overview formatting
packages/frontend/.../experiments.selectors.tsUse TS overview formatter; rename disabled field
packages/frontend/.../experiments.model.tsAdd ThompsonSamplingConfigDTO + overview labels rename
packages/frontend/.../experiments.effects.tsFetch rewards summary via new data service method
packages/frontend/.../experiments.effects.spec.tsRemove old rewards effect tests
packages/frontend/.../mooclet-helper.service.tsRemove Mooclet helper service
packages/frontend/.../mooclet-helper.service.spec.tsRemove Mooclet helper service tests
packages/frontend/.../experiments.service.tsUpdate prior update path to thompsonSamplingConfig.priors
packages/frontend/.../experiments.data.service.tsAdd fetchRewardsDataForExperiment; remove mooclet fetch
packages/frontend/.../api-endpoints.constants.tsRename rewards endpoint constant
packages/backend/test/unit/services/ThompsonSamplingService.test.tsAdd TS selection + weight estimation tests
packages/backend/test/unit/services/MoocletDataService.test.tsRemove Mooclet data service tests
packages/backend/test/unit/services/ExperimentService.test.tsRemove Mooclet deps from unit wiring/comments
packages/backend/test/unit/services/ExperimentAssignmentService.test.tsRemove Mooclet mock; add TS placeholders
packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.tsRemove Mooclet rewards mock
packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.tsRemove Mooclet experiment mock
packages/backend/test/unit/controllers/ExperimentController.test.tsRemove Mooclet cases; add TS crud placeholder
packages/backend/src/types/Mooclet.tsRemove Mooclet type definitions
packages/backend/src/env.tsRemove mooclets env block
packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.tsBootstrap missing TS configs/posteriors
packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.tsDrop Mooclet tables; migrate enum value
packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.tsCreate TS tables + enum addition
packages/backend/src/api/services/ThompsonSamplingService.tsNew TS selection + weight estimation engine
packages/backend/src/api/services/ThompsonSamplingRewardService.tsNew native reward recording + posterior increment
packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.tsNew TS config CRUD + rewards summary
packages/backend/src/api/services/MoocletRewardsService.tsRemove Mooclet rewards service
packages/backend/src/api/services/MoocletDataService.tsRemove Mooclet proxy/data service
packages/backend/src/api/services/ImportExportService.tsRemove Mooclet import/export paths
packages/backend/src/api/services/ExperimentService.tsRemove Mooclet validation/transaction notes
packages/backend/src/api/services/ExperimentAssignmentService.tsReplace Mooclet assignment with TS assignment
packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.tsNew TS reward repository
packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.tsNew TS config repository queries
packages/backend/src/api/repositories/MoocletExperimentRefRepository.tsRemove Mooclet ref repository
packages/backend/src/api/repositories/ConditionPosteriorStateRepository.tsNew posterior state repository
packages/backend/src/api/models/ThompsonSamplingReward.tsNew reward entity
packages/backend/src/api/models/ThompsonSamplingExperimentConfig.tsNew TS config entity
packages/backend/src/api/models/MoocletVersionConditionMap.tsRemove Mooclet mapping entity
packages/backend/src/api/models/MoocletExperimentRef.tsRemove Mooclet ref entity
packages/backend/src/api/models/ConditionPosteriorState.tsNew posterior state entity
packages/backend/src/api/middlewares/ErrorHandlerMiddleware.tsRemove Mooclet error cases
packages/backend/src/api/errors/MoocletError.tsRemove Mooclet error type
packages/backend/src/api/DTO/ExperimentDTO.tsReplace moocletPolicyParameters with thompsonSamplingConfig
packages/backend/src/api/controllers/ExperimentController.tsCreate/update TS config; add rewards summary endpoint
packages/backend/src/api/controllers/ExperimentClientController.v6.tsRewire /v6/reward to native TS reward service
packages/backend/rest-client-vscode/MoocletAPI.httpRemove Mooclet REST client doc
packages/backend/CLAUDE.mdRemove Mooclet transaction notes
packages/backend/.env.exampleRemove MOOCLETS_* env vars
packages/backend/.env.docker.local.exampleRemove MOOCLETS_* env vars
clientlibs/python/tests/test_client.pyUpdate reward response expectations
clientlibs/python/tests/test_api_service.pyUpdate reward response expectations
clientlibs/python/src/upgrade_client_lib/types/responses.pyRemove RewardDetails from response model
clientlibs/python/src/upgrade_client_lib/types/init.pyStop exporting RewardDetails
clientlibs/python/src/upgrade_client_lib/client.pyUpdate reward docstring wording
clientlibs/python/BUILD_PLAN.mdUpdate reward response contract
clientlibs/js/src/UpGradeClient/UpgradeClient.tsUpdate reward docstring wording
clientlibs/js/src/types/Interfaces.tsRemove reward details from response interface
CLAUDE.mdDocument native TS migration plan/progress
.claude/skills/setup-perftrace/SKILL.mdUpdate /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 +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);
}));
});
});
danoswaltCLand others added 3 commits September 1, 2026 16:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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

@danoswaltCL
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Draft
danoswaltCL wants to merge 4 commits into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 4 commits 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>

CopilotAI 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
FileDescription
postman/ClientAPI.postman_collection.jsonUpdate reward endpoint description
packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.tsRemove Mooclet TS DTO
packages/types/src/Mooclet/MoocletPolicyParametersDTO.tsRemove Mooclet policy base DTO
packages/types/src/Mooclet/index.tsRemove Mooclet exports/constants
packages/types/src/index.tsRe-export moved experiment interfaces
packages/types/src/Experiment/interfaces.tsAdd priors/reward types + estimatedWeight
packages/types/src/Experiment/enums.tsRename algorithm enum; remove Mooclet errors
packages/types/CLAUDE.mdRemove Mooclet folder note
packages/frontend/projects/upgrade/src/environments/environment.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.staging.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.qa.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.local.example.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.demo.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.bsnl.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment-types.tsRemove moocletToggle; rename rewards endpoint
packages/frontend/projects/upgrade/src/assets/i18n/en.jsonRename TS labels; add estimated weight strings
packages/frontend/.../ts-configurable-reward-count-table.component.tsAdd estimatedWeight column + tooltip module
packages/frontend/.../ts-configurable-reward-count-table.component.scssAdd estimated-weight-column styling
packages/frontend/.../ts-configurable-reward-count-table.component.htmlRender estimated weight column
packages/frontend/.../enrollment-condition-expandable-row.component.tsSwap helper service to Thompson Sampling
packages/frontend/.../enrollment-condition-expandable-row.component.htmlRename mooclet checks to TS checks
packages/frontend/.../experiment-details-page-content.component.tsShow reward feedback for TS algorithm
packages/frontend/.../experiment-conditions-table.component.tsRename input; switch TS column set
packages/frontend/.../experiment-conditions-table.component.htmlRename bindings; TS-specific N/A rendering
packages/frontend/.../experiment-conditions-section-card.component.tsSwap helper; use thompsonSamplingConfig priors
packages/frontend/.../experiment-conditions-section-card.component.htmlBind to thompsonSamplingConfig priors
packages/frontend/.../upsert-experiment-modal.component.tsReplace mooclet params with thompsonSamplingConfig
packages/frontend/.../upsert-experiment-modal.component.htmlRender TS form for TS algorithm
packages/frontend/.../ts-configurable-policy-parameters-form.component.tsConvert form to TS config fields
packages/frontend/.../ts-configurable-policy-parameters-form.component.htmlUpdate control names for renamed fields
packages/frontend/.../edit-condition-prior-modal.component.tsUse ThompsonSamplingHelperService validators
packages/frontend/.../thompson-sampling-helper.service.tsNew TS helper + validators + overview formatting
packages/frontend/.../experiments.selectors.tsUse TS overview formatter; rename disabled field
packages/frontend/.../experiments.model.tsAdd ThompsonSamplingConfigDTO + overview labels rename
packages/frontend/.../experiments.effects.tsFetch rewards summary via new data service method
packages/frontend/.../experiments.effects.spec.tsRemove old rewards effect tests
packages/frontend/.../mooclet-helper.service.tsRemove Mooclet helper service
packages/frontend/.../mooclet-helper.service.spec.tsRemove Mooclet helper service tests
packages/frontend/.../experiments.service.tsUpdate prior update path to thompsonSamplingConfig.priors
packages/frontend/.../experiments.data.service.tsAdd fetchRewardsDataForExperiment; remove mooclet fetch
packages/frontend/.../api-endpoints.constants.tsRename rewards endpoint constant
packages/backend/test/unit/services/ThompsonSamplingService.test.tsAdd TS selection + weight estimation tests
packages/backend/test/unit/services/MoocletDataService.test.tsRemove Mooclet data service tests
packages/backend/test/unit/services/ExperimentService.test.tsRemove Mooclet deps from unit wiring/comments
packages/backend/test/unit/services/ExperimentAssignmentService.test.tsRemove Mooclet mock; add TS placeholders
packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.tsRemove Mooclet rewards mock
packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.tsRemove Mooclet experiment mock
packages/backend/test/unit/controllers/ExperimentController.test.tsRemove Mooclet cases; add TS crud placeholder
packages/backend/src/types/Mooclet.tsRemove Mooclet type definitions
packages/backend/src/env.tsRemove mooclets env block
packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.tsBootstrap missing TS configs/posteriors
packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.tsDrop Mooclet tables; migrate enum value
packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.tsCreate TS tables + enum addition
packages/backend/src/api/services/ThompsonSamplingService.tsNew TS selection + weight estimation engine
packages/backend/src/api/services/ThompsonSamplingRewardService.tsNew native reward recording + posterior increment
packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.tsNew TS config CRUD + rewards summary
packages/backend/src/api/services/MoocletRewardsService.tsRemove Mooclet rewards service
packages/backend/src/api/services/MoocletDataService.tsRemove Mooclet proxy/data service
packages/backend/src/api/services/ImportExportService.tsRemove Mooclet import/export paths
packages/backend/src/api/services/ExperimentService.tsRemove Mooclet validation/transaction notes
packages/backend/src/api/services/ExperimentAssignmentService.tsReplace Mooclet assignment with TS assignment
packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.tsNew TS reward repository
packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.tsNew TS config repository queries
packages/backend/src/api/repositories/MoocletExperimentRefRepository.tsRemove Mooclet ref repository
packages/backend/src/api/repositories/ConditionPosteriorStateRepository.tsNew posterior state repository
packages/backend/src/api/models/ThompsonSamplingReward.tsNew reward entity
packages/backend/src/api/models/ThompsonSamplingExperimentConfig.tsNew TS config entity
packages/backend/src/api/models/MoocletVersionConditionMap.tsRemove Mooclet mapping entity
packages/backend/src/api/models/MoocletExperimentRef.tsRemove Mooclet ref entity
packages/backend/src/api/models/ConditionPosteriorState.tsNew posterior state entity
packages/backend/src/api/middlewares/ErrorHandlerMiddleware.tsRemove Mooclet error cases
packages/backend/src/api/errors/MoocletError.tsRemove Mooclet error type
packages/backend/src/api/DTO/ExperimentDTO.tsReplace moocletPolicyParameters with thompsonSamplingConfig
packages/backend/src/api/controllers/ExperimentController.tsCreate/update TS config; add rewards summary endpoint
packages/backend/src/api/controllers/ExperimentClientController.v6.tsRewire /v6/reward to native TS reward service
packages/backend/rest-client-vscode/MoocletAPI.httpRemove Mooclet REST client doc
packages/backend/CLAUDE.mdRemove Mooclet transaction notes
packages/backend/.env.exampleRemove MOOCLETS_* env vars
packages/backend/.env.docker.local.exampleRemove MOOCLETS_* env vars
clientlibs/python/tests/test_client.pyUpdate reward response expectations
clientlibs/python/tests/test_api_service.pyUpdate reward response expectations
clientlibs/python/src/upgrade_client_lib/types/responses.pyRemove RewardDetails from response model
clientlibs/python/src/upgrade_client_lib/types/init.pyStop exporting RewardDetails
clientlibs/python/src/upgrade_client_lib/client.pyUpdate reward docstring wording
clientlibs/python/BUILD_PLAN.mdUpdate reward response contract
clientlibs/js/src/UpGradeClient/UpgradeClient.tsUpdate reward docstring wording
clientlibs/js/src/types/Interfaces.tsRemove reward details from response interface
CLAUDE.mdDocument native TS migration plan/progress
.claude/skills/setup-perftrace/SKILL.mdUpdate /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 +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);
}));
});
});
danoswaltCLand others added 3 commits September 1, 2026 16:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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

@danoswaltCL
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

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

Draft
danoswaltCL wants to merge 4 commits into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 4 commits 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>

CopilotAI 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
FileDescription
postman/ClientAPI.postman_collection.jsonUpdate reward endpoint description
packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.tsRemove Mooclet TS DTO
packages/types/src/Mooclet/MoocletPolicyParametersDTO.tsRemove Mooclet policy base DTO
packages/types/src/Mooclet/index.tsRemove Mooclet exports/constants
packages/types/src/index.tsRe-export moved experiment interfaces
packages/types/src/Experiment/interfaces.tsAdd priors/reward types + estimatedWeight
packages/types/src/Experiment/enums.tsRename algorithm enum; remove Mooclet errors
packages/types/CLAUDE.mdRemove Mooclet folder note
packages/frontend/projects/upgrade/src/environments/environment.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.staging.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.qa.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.local.example.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.demo.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.bsnl.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment-types.tsRemove moocletToggle; rename rewards endpoint
packages/frontend/projects/upgrade/src/assets/i18n/en.jsonRename TS labels; add estimated weight strings
packages/frontend/.../ts-configurable-reward-count-table.component.tsAdd estimatedWeight column + tooltip module
packages/frontend/.../ts-configurable-reward-count-table.component.scssAdd estimated-weight-column styling
packages/frontend/.../ts-configurable-reward-count-table.component.htmlRender estimated weight column
packages/frontend/.../enrollment-condition-expandable-row.component.tsSwap helper service to Thompson Sampling
packages/frontend/.../enrollment-condition-expandable-row.component.htmlRename mooclet checks to TS checks
packages/frontend/.../experiment-details-page-content.component.tsShow reward feedback for TS algorithm
packages/frontend/.../experiment-conditions-table.component.tsRename input; switch TS column set
packages/frontend/.../experiment-conditions-table.component.htmlRename bindings; TS-specific N/A rendering
packages/frontend/.../experiment-conditions-section-card.component.tsSwap helper; use thompsonSamplingConfig priors
packages/frontend/.../experiment-conditions-section-card.component.htmlBind to thompsonSamplingConfig priors
packages/frontend/.../upsert-experiment-modal.component.tsReplace mooclet params with thompsonSamplingConfig
packages/frontend/.../upsert-experiment-modal.component.htmlRender TS form for TS algorithm
packages/frontend/.../ts-configurable-policy-parameters-form.component.tsConvert form to TS config fields
packages/frontend/.../ts-configurable-policy-parameters-form.component.htmlUpdate control names for renamed fields
packages/frontend/.../edit-condition-prior-modal.component.tsUse ThompsonSamplingHelperService validators
packages/frontend/.../thompson-sampling-helper.service.tsNew TS helper + validators + overview formatting
packages/frontend/.../experiments.selectors.tsUse TS overview formatter; rename disabled field
packages/frontend/.../experiments.model.tsAdd ThompsonSamplingConfigDTO + overview labels rename
packages/frontend/.../experiments.effects.tsFetch rewards summary via new data service method
packages/frontend/.../experiments.effects.spec.tsRemove old rewards effect tests
packages/frontend/.../mooclet-helper.service.tsRemove Mooclet helper service
packages/frontend/.../mooclet-helper.service.spec.tsRemove Mooclet helper service tests
packages/frontend/.../experiments.service.tsUpdate prior update path to thompsonSamplingConfig.priors
packages/frontend/.../experiments.data.service.tsAdd fetchRewardsDataForExperiment; remove mooclet fetch
packages/frontend/.../api-endpoints.constants.tsRename rewards endpoint constant
packages/backend/test/unit/services/ThompsonSamplingService.test.tsAdd TS selection + weight estimation tests
packages/backend/test/unit/services/MoocletDataService.test.tsRemove Mooclet data service tests
packages/backend/test/unit/services/ExperimentService.test.tsRemove Mooclet deps from unit wiring/comments
packages/backend/test/unit/services/ExperimentAssignmentService.test.tsRemove Mooclet mock; add TS placeholders
packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.tsRemove Mooclet rewards mock
packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.tsRemove Mooclet experiment mock
packages/backend/test/unit/controllers/ExperimentController.test.tsRemove Mooclet cases; add TS crud placeholder
packages/backend/src/types/Mooclet.tsRemove Mooclet type definitions
packages/backend/src/env.tsRemove mooclets env block
packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.tsBootstrap missing TS configs/posteriors
packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.tsDrop Mooclet tables; migrate enum value
packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.tsCreate TS tables + enum addition
packages/backend/src/api/services/ThompsonSamplingService.tsNew TS selection + weight estimation engine
packages/backend/src/api/services/ThompsonSamplingRewardService.tsNew native reward recording + posterior increment
packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.tsNew TS config CRUD + rewards summary
packages/backend/src/api/services/MoocletRewardsService.tsRemove Mooclet rewards service
packages/backend/src/api/services/MoocletDataService.tsRemove Mooclet proxy/data service
packages/backend/src/api/services/ImportExportService.tsRemove Mooclet import/export paths
packages/backend/src/api/services/ExperimentService.tsRemove Mooclet validation/transaction notes
packages/backend/src/api/services/ExperimentAssignmentService.tsReplace Mooclet assignment with TS assignment
packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.tsNew TS reward repository
packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.tsNew TS config repository queries
packages/backend/src/api/repositories/MoocletExperimentRefRepository.tsRemove Mooclet ref repository
packages/backend/src/api/repositories/ConditionPosteriorStateRepository.tsNew posterior state repository
packages/backend/src/api/models/ThompsonSamplingReward.tsNew reward entity
packages/backend/src/api/models/ThompsonSamplingExperimentConfig.tsNew TS config entity
packages/backend/src/api/models/MoocletVersionConditionMap.tsRemove Mooclet mapping entity
packages/backend/src/api/models/MoocletExperimentRef.tsRemove Mooclet ref entity
packages/backend/src/api/models/ConditionPosteriorState.tsNew posterior state entity
packages/backend/src/api/middlewares/ErrorHandlerMiddleware.tsRemove Mooclet error cases
packages/backend/src/api/errors/MoocletError.tsRemove Mooclet error type
packages/backend/src/api/DTO/ExperimentDTO.tsReplace moocletPolicyParameters with thompsonSamplingConfig
packages/backend/src/api/controllers/ExperimentController.tsCreate/update TS config; add rewards summary endpoint
packages/backend/src/api/controllers/ExperimentClientController.v6.tsRewire /v6/reward to native TS reward service
packages/backend/rest-client-vscode/MoocletAPI.httpRemove Mooclet REST client doc
packages/backend/CLAUDE.mdRemove Mooclet transaction notes
packages/backend/.env.exampleRemove MOOCLETS_* env vars
packages/backend/.env.docker.local.exampleRemove MOOCLETS_* env vars
clientlibs/python/tests/test_client.pyUpdate reward response expectations
clientlibs/python/tests/test_api_service.pyUpdate reward response expectations
clientlibs/python/src/upgrade_client_lib/types/responses.pyRemove RewardDetails from response model
clientlibs/python/src/upgrade_client_lib/types/init.pyStop exporting RewardDetails
clientlibs/python/src/upgrade_client_lib/client.pyUpdate reward docstring wording
clientlibs/python/BUILD_PLAN.mdUpdate reward response contract
clientlibs/js/src/UpGradeClient/UpgradeClient.tsUpdate reward docstring wording
clientlibs/js/src/types/Interfaces.tsRemove reward details from response interface
CLAUDE.mdDocument native TS migration plan/progress
.claude/skills/setup-perftrace/SKILL.mdUpdate /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 +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);
}));
});
});
danoswaltCLand others added 3 commits September 1, 2026 16:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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

@danoswaltCL
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Draft
danoswaltCL wants to merge 4 commits into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 4 commits 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>

CopilotAI 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
FileDescription
postman/ClientAPI.postman_collection.jsonUpdate reward endpoint description
packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.tsRemove Mooclet TS DTO
packages/types/src/Mooclet/MoocletPolicyParametersDTO.tsRemove Mooclet policy base DTO
packages/types/src/Mooclet/index.tsRemove Mooclet exports/constants
packages/types/src/index.tsRe-export moved experiment interfaces
packages/types/src/Experiment/interfaces.tsAdd priors/reward types + estimatedWeight
packages/types/src/Experiment/enums.tsRename algorithm enum; remove Mooclet errors
packages/types/CLAUDE.mdRemove Mooclet folder note
packages/frontend/projects/upgrade/src/environments/environment.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.staging.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.qa.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.local.example.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.demo.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.bsnl.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment-types.tsRemove moocletToggle; rename rewards endpoint
packages/frontend/projects/upgrade/src/assets/i18n/en.jsonRename TS labels; add estimated weight strings
packages/frontend/.../ts-configurable-reward-count-table.component.tsAdd estimatedWeight column + tooltip module
packages/frontend/.../ts-configurable-reward-count-table.component.scssAdd estimated-weight-column styling
packages/frontend/.../ts-configurable-reward-count-table.component.htmlRender estimated weight column
packages/frontend/.../enrollment-condition-expandable-row.component.tsSwap helper service to Thompson Sampling
packages/frontend/.../enrollment-condition-expandable-row.component.htmlRename mooclet checks to TS checks
packages/frontend/.../experiment-details-page-content.component.tsShow reward feedback for TS algorithm
packages/frontend/.../experiment-conditions-table.component.tsRename input; switch TS column set
packages/frontend/.../experiment-conditions-table.component.htmlRename bindings; TS-specific N/A rendering
packages/frontend/.../experiment-conditions-section-card.component.tsSwap helper; use thompsonSamplingConfig priors
packages/frontend/.../experiment-conditions-section-card.component.htmlBind to thompsonSamplingConfig priors
packages/frontend/.../upsert-experiment-modal.component.tsReplace mooclet params with thompsonSamplingConfig
packages/frontend/.../upsert-experiment-modal.component.htmlRender TS form for TS algorithm
packages/frontend/.../ts-configurable-policy-parameters-form.component.tsConvert form to TS config fields
packages/frontend/.../ts-configurable-policy-parameters-form.component.htmlUpdate control names for renamed fields
packages/frontend/.../edit-condition-prior-modal.component.tsUse ThompsonSamplingHelperService validators
packages/frontend/.../thompson-sampling-helper.service.tsNew TS helper + validators + overview formatting
packages/frontend/.../experiments.selectors.tsUse TS overview formatter; rename disabled field
packages/frontend/.../experiments.model.tsAdd ThompsonSamplingConfigDTO + overview labels rename
packages/frontend/.../experiments.effects.tsFetch rewards summary via new data service method
packages/frontend/.../experiments.effects.spec.tsRemove old rewards effect tests
packages/frontend/.../mooclet-helper.service.tsRemove Mooclet helper service
packages/frontend/.../mooclet-helper.service.spec.tsRemove Mooclet helper service tests
packages/frontend/.../experiments.service.tsUpdate prior update path to thompsonSamplingConfig.priors
packages/frontend/.../experiments.data.service.tsAdd fetchRewardsDataForExperiment; remove mooclet fetch
packages/frontend/.../api-endpoints.constants.tsRename rewards endpoint constant
packages/backend/test/unit/services/ThompsonSamplingService.test.tsAdd TS selection + weight estimation tests
packages/backend/test/unit/services/MoocletDataService.test.tsRemove Mooclet data service tests
packages/backend/test/unit/services/ExperimentService.test.tsRemove Mooclet deps from unit wiring/comments
packages/backend/test/unit/services/ExperimentAssignmentService.test.tsRemove Mooclet mock; add TS placeholders
packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.tsRemove Mooclet rewards mock
packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.tsRemove Mooclet experiment mock
packages/backend/test/unit/controllers/ExperimentController.test.tsRemove Mooclet cases; add TS crud placeholder
packages/backend/src/types/Mooclet.tsRemove Mooclet type definitions
packages/backend/src/env.tsRemove mooclets env block
packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.tsBootstrap missing TS configs/posteriors
packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.tsDrop Mooclet tables; migrate enum value
packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.tsCreate TS tables + enum addition
packages/backend/src/api/services/ThompsonSamplingService.tsNew TS selection + weight estimation engine
packages/backend/src/api/services/ThompsonSamplingRewardService.tsNew native reward recording + posterior increment
packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.tsNew TS config CRUD + rewards summary
packages/backend/src/api/services/MoocletRewardsService.tsRemove Mooclet rewards service
packages/backend/src/api/services/MoocletDataService.tsRemove Mooclet proxy/data service
packages/backend/src/api/services/ImportExportService.tsRemove Mooclet import/export paths
packages/backend/src/api/services/ExperimentService.tsRemove Mooclet validation/transaction notes
packages/backend/src/api/services/ExperimentAssignmentService.tsReplace Mooclet assignment with TS assignment
packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.tsNew TS reward repository
packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.tsNew TS config repository queries
packages/backend/src/api/repositories/MoocletExperimentRefRepository.tsRemove Mooclet ref repository
packages/backend/src/api/repositories/ConditionPosteriorStateRepository.tsNew posterior state repository
packages/backend/src/api/models/ThompsonSamplingReward.tsNew reward entity
packages/backend/src/api/models/ThompsonSamplingExperimentConfig.tsNew TS config entity
packages/backend/src/api/models/MoocletVersionConditionMap.tsRemove Mooclet mapping entity
packages/backend/src/api/models/MoocletExperimentRef.tsRemove Mooclet ref entity
packages/backend/src/api/models/ConditionPosteriorState.tsNew posterior state entity
packages/backend/src/api/middlewares/ErrorHandlerMiddleware.tsRemove Mooclet error cases
packages/backend/src/api/errors/MoocletError.tsRemove Mooclet error type
packages/backend/src/api/DTO/ExperimentDTO.tsReplace moocletPolicyParameters with thompsonSamplingConfig
packages/backend/src/api/controllers/ExperimentController.tsCreate/update TS config; add rewards summary endpoint
packages/backend/src/api/controllers/ExperimentClientController.v6.tsRewire /v6/reward to native TS reward service
packages/backend/rest-client-vscode/MoocletAPI.httpRemove Mooclet REST client doc
packages/backend/CLAUDE.mdRemove Mooclet transaction notes
packages/backend/.env.exampleRemove MOOCLETS_* env vars
packages/backend/.env.docker.local.exampleRemove MOOCLETS_* env vars
clientlibs/python/tests/test_client.pyUpdate reward response expectations
clientlibs/python/tests/test_api_service.pyUpdate reward response expectations
clientlibs/python/src/upgrade_client_lib/types/responses.pyRemove RewardDetails from response model
clientlibs/python/src/upgrade_client_lib/types/init.pyStop exporting RewardDetails
clientlibs/python/src/upgrade_client_lib/client.pyUpdate reward docstring wording
clientlibs/python/BUILD_PLAN.mdUpdate reward response contract
clientlibs/js/src/UpGradeClient/UpgradeClient.tsUpdate reward docstring wording
clientlibs/js/src/types/Interfaces.tsRemove reward details from response interface
CLAUDE.mdDocument native TS migration plan/progress
.claude/skills/setup-perftrace/SKILL.mdUpdate /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 +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);
}));
});
});
danoswaltCLand others added 3 commits September 1, 2026 16:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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

@danoswaltCL
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Draft
danoswaltCL wants to merge 4 commits into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 4 commits 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>

CopilotAI 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
FileDescription
postman/ClientAPI.postman_collection.jsonUpdate reward endpoint description
packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.tsRemove Mooclet TS DTO
packages/types/src/Mooclet/MoocletPolicyParametersDTO.tsRemove Mooclet policy base DTO
packages/types/src/Mooclet/index.tsRemove Mooclet exports/constants
packages/types/src/index.tsRe-export moved experiment interfaces
packages/types/src/Experiment/interfaces.tsAdd priors/reward types + estimatedWeight
packages/types/src/Experiment/enums.tsRename algorithm enum; remove Mooclet errors
packages/types/CLAUDE.mdRemove Mooclet folder note
packages/frontend/projects/upgrade/src/environments/environment.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.staging.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.qa.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.local.example.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.demo.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.bsnl.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment-types.tsRemove moocletToggle; rename rewards endpoint
packages/frontend/projects/upgrade/src/assets/i18n/en.jsonRename TS labels; add estimated weight strings
packages/frontend/.../ts-configurable-reward-count-table.component.tsAdd estimatedWeight column + tooltip module
packages/frontend/.../ts-configurable-reward-count-table.component.scssAdd estimated-weight-column styling
packages/frontend/.../ts-configurable-reward-count-table.component.htmlRender estimated weight column
packages/frontend/.../enrollment-condition-expandable-row.component.tsSwap helper service to Thompson Sampling
packages/frontend/.../enrollment-condition-expandable-row.component.htmlRename mooclet checks to TS checks
packages/frontend/.../experiment-details-page-content.component.tsShow reward feedback for TS algorithm
packages/frontend/.../experiment-conditions-table.component.tsRename input; switch TS column set
packages/frontend/.../experiment-conditions-table.component.htmlRename bindings; TS-specific N/A rendering
packages/frontend/.../experiment-conditions-section-card.component.tsSwap helper; use thompsonSamplingConfig priors
packages/frontend/.../experiment-conditions-section-card.component.htmlBind to thompsonSamplingConfig priors
packages/frontend/.../upsert-experiment-modal.component.tsReplace mooclet params with thompsonSamplingConfig
packages/frontend/.../upsert-experiment-modal.component.htmlRender TS form for TS algorithm
packages/frontend/.../ts-configurable-policy-parameters-form.component.tsConvert form to TS config fields
packages/frontend/.../ts-configurable-policy-parameters-form.component.htmlUpdate control names for renamed fields
packages/frontend/.../edit-condition-prior-modal.component.tsUse ThompsonSamplingHelperService validators
packages/frontend/.../thompson-sampling-helper.service.tsNew TS helper + validators + overview formatting
packages/frontend/.../experiments.selectors.tsUse TS overview formatter; rename disabled field
packages/frontend/.../experiments.model.tsAdd ThompsonSamplingConfigDTO + overview labels rename
packages/frontend/.../experiments.effects.tsFetch rewards summary via new data service method
packages/frontend/.../experiments.effects.spec.tsRemove old rewards effect tests
packages/frontend/.../mooclet-helper.service.tsRemove Mooclet helper service
packages/frontend/.../mooclet-helper.service.spec.tsRemove Mooclet helper service tests
packages/frontend/.../experiments.service.tsUpdate prior update path to thompsonSamplingConfig.priors
packages/frontend/.../experiments.data.service.tsAdd fetchRewardsDataForExperiment; remove mooclet fetch
packages/frontend/.../api-endpoints.constants.tsRename rewards endpoint constant
packages/backend/test/unit/services/ThompsonSamplingService.test.tsAdd TS selection + weight estimation tests
packages/backend/test/unit/services/MoocletDataService.test.tsRemove Mooclet data service tests
packages/backend/test/unit/services/ExperimentService.test.tsRemove Mooclet deps from unit wiring/comments
packages/backend/test/unit/services/ExperimentAssignmentService.test.tsRemove Mooclet mock; add TS placeholders
packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.tsRemove Mooclet rewards mock
packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.tsRemove Mooclet experiment mock
packages/backend/test/unit/controllers/ExperimentController.test.tsRemove Mooclet cases; add TS crud placeholder
packages/backend/src/types/Mooclet.tsRemove Mooclet type definitions
packages/backend/src/env.tsRemove mooclets env block
packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.tsBootstrap missing TS configs/posteriors
packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.tsDrop Mooclet tables; migrate enum value
packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.tsCreate TS tables + enum addition
packages/backend/src/api/services/ThompsonSamplingService.tsNew TS selection + weight estimation engine
packages/backend/src/api/services/ThompsonSamplingRewardService.tsNew native reward recording + posterior increment
packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.tsNew TS config CRUD + rewards summary
packages/backend/src/api/services/MoocletRewardsService.tsRemove Mooclet rewards service
packages/backend/src/api/services/MoocletDataService.tsRemove Mooclet proxy/data service
packages/backend/src/api/services/ImportExportService.tsRemove Mooclet import/export paths
packages/backend/src/api/services/ExperimentService.tsRemove Mooclet validation/transaction notes
packages/backend/src/api/services/ExperimentAssignmentService.tsReplace Mooclet assignment with TS assignment
packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.tsNew TS reward repository
packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.tsNew TS config repository queries
packages/backend/src/api/repositories/MoocletExperimentRefRepository.tsRemove Mooclet ref repository
packages/backend/src/api/repositories/ConditionPosteriorStateRepository.tsNew posterior state repository
packages/backend/src/api/models/ThompsonSamplingReward.tsNew reward entity
packages/backend/src/api/models/ThompsonSamplingExperimentConfig.tsNew TS config entity
packages/backend/src/api/models/MoocletVersionConditionMap.tsRemove Mooclet mapping entity
packages/backend/src/api/models/MoocletExperimentRef.tsRemove Mooclet ref entity
packages/backend/src/api/models/ConditionPosteriorState.tsNew posterior state entity
packages/backend/src/api/middlewares/ErrorHandlerMiddleware.tsRemove Mooclet error cases
packages/backend/src/api/errors/MoocletError.tsRemove Mooclet error type
packages/backend/src/api/DTO/ExperimentDTO.tsReplace moocletPolicyParameters with thompsonSamplingConfig
packages/backend/src/api/controllers/ExperimentController.tsCreate/update TS config; add rewards summary endpoint
packages/backend/src/api/controllers/ExperimentClientController.v6.tsRewire /v6/reward to native TS reward service
packages/backend/rest-client-vscode/MoocletAPI.httpRemove Mooclet REST client doc
packages/backend/CLAUDE.mdRemove Mooclet transaction notes
packages/backend/.env.exampleRemove MOOCLETS_* env vars
packages/backend/.env.docker.local.exampleRemove MOOCLETS_* env vars
clientlibs/python/tests/test_client.pyUpdate reward response expectations
clientlibs/python/tests/test_api_service.pyUpdate reward response expectations
clientlibs/python/src/upgrade_client_lib/types/responses.pyRemove RewardDetails from response model
clientlibs/python/src/upgrade_client_lib/types/init.pyStop exporting RewardDetails
clientlibs/python/src/upgrade_client_lib/client.pyUpdate reward docstring wording
clientlibs/python/BUILD_PLAN.mdUpdate reward response contract
clientlibs/js/src/UpGradeClient/UpgradeClient.tsUpdate reward docstring wording
clientlibs/js/src/types/Interfaces.tsRemove reward details from response interface
CLAUDE.mdDocument native TS migration plan/progress
.claude/skills/setup-perftrace/SKILL.mdUpdate /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 +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);
}));
});
});
danoswaltCLand others added 3 commits September 1, 2026 16:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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

@danoswaltCL
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

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

Draft
danoswaltCL wants to merge 4 commits into
devfrom
poc/native-thompson-sampling-experiments
Draft

removed mooclet infrastructure, implemented native thompson-sampling …#3304
danoswaltCL wants to merge 4 commits 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>

CopilotAI 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
FileDescription
postman/ClientAPI.postman_collection.jsonUpdate reward endpoint description
packages/types/src/Mooclet/MoocletTSConfigurablePolicyParametersDTO.tsRemove Mooclet TS DTO
packages/types/src/Mooclet/MoocletPolicyParametersDTO.tsRemove Mooclet policy base DTO
packages/types/src/Mooclet/index.tsRemove Mooclet exports/constants
packages/types/src/index.tsRe-export moved experiment interfaces
packages/types/src/Experiment/interfaces.tsAdd priors/reward types + estimatedWeight
packages/types/src/Experiment/enums.tsRename algorithm enum; remove Mooclet errors
packages/types/CLAUDE.mdRemove Mooclet folder note
packages/frontend/projects/upgrade/src/environments/environment.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.staging.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.qa.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.local.example.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.demo.prod.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment.bsnl.tsRemove moocletToggle
packages/frontend/projects/upgrade/src/environments/environment-types.tsRemove moocletToggle; rename rewards endpoint
packages/frontend/projects/upgrade/src/assets/i18n/en.jsonRename TS labels; add estimated weight strings
packages/frontend/.../ts-configurable-reward-count-table.component.tsAdd estimatedWeight column + tooltip module
packages/frontend/.../ts-configurable-reward-count-table.component.scssAdd estimated-weight-column styling
packages/frontend/.../ts-configurable-reward-count-table.component.htmlRender estimated weight column
packages/frontend/.../enrollment-condition-expandable-row.component.tsSwap helper service to Thompson Sampling
packages/frontend/.../enrollment-condition-expandable-row.component.htmlRename mooclet checks to TS checks
packages/frontend/.../experiment-details-page-content.component.tsShow reward feedback for TS algorithm
packages/frontend/.../experiment-conditions-table.component.tsRename input; switch TS column set
packages/frontend/.../experiment-conditions-table.component.htmlRename bindings; TS-specific N/A rendering
packages/frontend/.../experiment-conditions-section-card.component.tsSwap helper; use thompsonSamplingConfig priors
packages/frontend/.../experiment-conditions-section-card.component.htmlBind to thompsonSamplingConfig priors
packages/frontend/.../upsert-experiment-modal.component.tsReplace mooclet params with thompsonSamplingConfig
packages/frontend/.../upsert-experiment-modal.component.htmlRender TS form for TS algorithm
packages/frontend/.../ts-configurable-policy-parameters-form.component.tsConvert form to TS config fields
packages/frontend/.../ts-configurable-policy-parameters-form.component.htmlUpdate control names for renamed fields
packages/frontend/.../edit-condition-prior-modal.component.tsUse ThompsonSamplingHelperService validators
packages/frontend/.../thompson-sampling-helper.service.tsNew TS helper + validators + overview formatting
packages/frontend/.../experiments.selectors.tsUse TS overview formatter; rename disabled field
packages/frontend/.../experiments.model.tsAdd ThompsonSamplingConfigDTO + overview labels rename
packages/frontend/.../experiments.effects.tsFetch rewards summary via new data service method
packages/frontend/.../experiments.effects.spec.tsRemove old rewards effect tests
packages/frontend/.../mooclet-helper.service.tsRemove Mooclet helper service
packages/frontend/.../mooclet-helper.service.spec.tsRemove Mooclet helper service tests
packages/frontend/.../experiments.service.tsUpdate prior update path to thompsonSamplingConfig.priors
packages/frontend/.../experiments.data.service.tsAdd fetchRewardsDataForExperiment; remove mooclet fetch
packages/frontend/.../api-endpoints.constants.tsRename rewards endpoint constant
packages/backend/test/unit/services/ThompsonSamplingService.test.tsAdd TS selection + weight estimation tests
packages/backend/test/unit/services/MoocletDataService.test.tsRemove Mooclet data service tests
packages/backend/test/unit/services/ExperimentService.test.tsRemove Mooclet deps from unit wiring/comments
packages/backend/test/unit/services/ExperimentAssignmentService.test.tsRemove Mooclet mock; add TS placeholders
packages/backend/test/unit/controllers/mocks/MoocletRewardsServiceMock.tsRemove Mooclet rewards mock
packages/backend/test/unit/controllers/mocks/MoocletExperimentServiceMock.tsRemove Mooclet experiment mock
packages/backend/test/unit/controllers/ExperimentController.test.tsRemove Mooclet cases; add TS crud placeholder
packages/backend/src/types/Mooclet.tsRemove Mooclet type definitions
packages/backend/src/env.tsRemove mooclets env block
packages/backend/src/database/migrations/1781395200000-bootstrapThompsonSamplingConfigs.tsBootstrap missing TS configs/posteriors
packages/backend/src/database/migrations/1781308800000-cleanupMoocletEntities.tsDrop Mooclet tables; migrate enum value
packages/backend/src/database/migrations/1781222400000-thompsonSamplingEntities.tsCreate TS tables + enum addition
packages/backend/src/api/services/ThompsonSamplingService.tsNew TS selection + weight estimation engine
packages/backend/src/api/services/ThompsonSamplingRewardService.tsNew native reward recording + posterior increment
packages/backend/src/api/services/ThompsonSamplingExperimentCrudService.tsNew TS config CRUD + rewards summary
packages/backend/src/api/services/MoocletRewardsService.tsRemove Mooclet rewards service
packages/backend/src/api/services/MoocletDataService.tsRemove Mooclet proxy/data service
packages/backend/src/api/services/ImportExportService.tsRemove Mooclet import/export paths
packages/backend/src/api/services/ExperimentService.tsRemove Mooclet validation/transaction notes
packages/backend/src/api/services/ExperimentAssignmentService.tsReplace Mooclet assignment with TS assignment
packages/backend/src/api/repositories/ThompsonSamplingRewardRepository.tsNew TS reward repository
packages/backend/src/api/repositories/ThompsonSamplingExperimentConfigRepository.tsNew TS config repository queries
packages/backend/src/api/repositories/MoocletExperimentRefRepository.tsRemove Mooclet ref repository
packages/backend/src/api/repositories/ConditionPosteriorStateRepository.tsNew posterior state repository
packages/backend/src/api/models/ThompsonSamplingReward.tsNew reward entity
packages/backend/src/api/models/ThompsonSamplingExperimentConfig.tsNew TS config entity
packages/backend/src/api/models/MoocletVersionConditionMap.tsRemove Mooclet mapping entity
packages/backend/src/api/models/MoocletExperimentRef.tsRemove Mooclet ref entity
packages/backend/src/api/models/ConditionPosteriorState.tsNew posterior state entity
packages/backend/src/api/middlewares/ErrorHandlerMiddleware.tsRemove Mooclet error cases
packages/backend/src/api/errors/MoocletError.tsRemove Mooclet error type
packages/backend/src/api/DTO/ExperimentDTO.tsReplace moocletPolicyParameters with thompsonSamplingConfig
packages/backend/src/api/controllers/ExperimentController.tsCreate/update TS config; add rewards summary endpoint
packages/backend/src/api/controllers/ExperimentClientController.v6.tsRewire /v6/reward to native TS reward service
packages/backend/rest-client-vscode/MoocletAPI.httpRemove Mooclet REST client doc
packages/backend/CLAUDE.mdRemove Mooclet transaction notes
packages/backend/.env.exampleRemove MOOCLETS_* env vars
packages/backend/.env.docker.local.exampleRemove MOOCLETS_* env vars
clientlibs/python/tests/test_client.pyUpdate reward response expectations
clientlibs/python/tests/test_api_service.pyUpdate reward response expectations
clientlibs/python/src/upgrade_client_lib/types/responses.pyRemove RewardDetails from response model
clientlibs/python/src/upgrade_client_lib/types/init.pyStop exporting RewardDetails
clientlibs/python/src/upgrade_client_lib/client.pyUpdate reward docstring wording
clientlibs/python/BUILD_PLAN.mdUpdate reward response contract
clientlibs/js/src/UpGradeClient/UpgradeClient.tsUpdate reward docstring wording
clientlibs/js/src/types/Interfaces.tsRemove reward details from response interface
CLAUDE.mdDocument native TS migration plan/progress
.claude/skills/setup-perftrace/SKILL.mdUpdate /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 +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);
}));
});
});
danoswaltCLand others added 3 commits September 1, 2026 16:23
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Sign up for freeto 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

@danoswaltCL