refactor(planning): remove the original decision trace
CI / policy (push) Successful in 7s
CI / validate (push) Successful in 1m15s
CI / test (push) Successful in 3m18s
CI / benchmark (push) Failing after 5m53s
CI / build (push) Successful in 1m23s
CI / security (push) Successful in 7m6s
CI / policy (pull_request) Successful in 7s
CI / validate (pull_request) Successful in 1m9s
CI / build (pull_request) Successful in 43s
CI / test (pull_request) Successful in 3m19s
CI / images (push) Successful in 3m7s
CI / required (push) Successful in 2s
CI / benchmark (pull_request) Failing after 5m28s
CI / security (pull_request) Successful in 6m37s
CI / images (pull_request) Successful in 3m18s
CI / required (pull_request) Successful in 1s

This commit is contained in:
nessar committed 2026-10-15 20:42:33 +02:00
1 parent ea4256107f
commit d9d9befa12
43 files changed
+729 -8880

No files matched your search

+4 -76
View File
@@ -76,15 +76,7 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
simulatedElapsed = data.elapsed;
return;
}
if (
holdArtifacts &&
[
'explanation',
'artifacts-start',
'trace-status-index',
'artifacts-complete',
].includes(data.type)
) {
if (holdArtifacts && ['explanation', 'artifacts'].includes(data.type)) {
heldArtifactMessages.push(() => this.onmessage?.({ data } as MessageEvent));
return;
}
@@ -152,14 +144,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
'balance-expiry',
'placement-date',
]);
const trace = await calculation.trace;
expect(trace?.phases.map((phase) => phase.name)).toEqual([
'validation',
'obligations',
'optimization:personal-loss',
'expiry',
'dates',
]);
const comparison = await calculation.analyzeCounterfactual(outcome.placements[0]);
if (comparison.kind !== 'Counterfactual') throw new Error('Expected worker comparison');
expect(comparison.baseline.objectives.map((objective) => objective.id)).toEqual([
@@ -170,7 +154,7 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
]);
});
it('keeps the submitted work-sequence threshold in the real worker, trace and counterfactuals', async () => {
it('keeps the submitted work-sequence threshold in the real worker and date comparisons', async () => {
const configuration: OptimizationConfiguration = structuredClone(
OPTIMIZATION_PRESETS.shortSequenceDeficit,
);
@@ -206,15 +190,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
({ id }) => id === 'optimization:deficit',
)?.value,
).toBe(4);
const trace = await calculation.trace;
const chosen = trace?.phases
.flatMap(({ decisions }) => decisions.flatMap(({ candidates }) => candidates))
.find((candidate) => candidate.status === 'chosen' && candidate.dates?.length === 3);
expect(chosen?.comparison?.firstDecisiveObjective).toBe('optimization:deficit');
expect(
chosen?.comparison?.before.objectives.find(({ id }) => id === 'optimization:deficit')
?.value,
).toBe(2);
const counterfactual = await calculation.analyzeCounterfactual(outcome.placements[0]);
if (counterfactual.kind !== 'Counterfactual') throw new Error('Expected a counterfactual');
expect(
@@ -390,7 +365,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
for (const deliver of heldArtifactMessages.splice(0)) deliver();
}
const explanation = await calculation.explanation;
const trace = await calculation.trace;
await fixture.whenStable();
fixture.detectChanges();
expect(connectedHolidays()).toBe('1');
@@ -416,11 +390,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
},
],
});
expect(trace?.initialState).toMatchObject({
calculationDate: '2024-05-01',
declaredDays: originalDeclarations,
});
expect(trace?.status).toBe(cancelled ? 'incomplete' : 'ready');
const core = await import('./leave-planner.core');
const direct = core.calculatePlanningInternal(calculation.snapshot);
if (direct.kind !== 'Plan')
@@ -450,24 +419,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
expect(comparison?.results.find(({ date }) => date === '2024-05-03')?.status).toBe(
'eligible',
);
fixture.componentInstance['showFinalPlan']();
if (!trace) throw new Error('Expected the original trace.');
const phaseIndex = trace.phases.findIndex(({ decisions }) =>
decisions.some(({ deltas }) =>
deltas.some(({ placement }) => placement?.balanceId.startsWith('earned:')),
),
);
expect(phaseIndex).toBeGreaterThanOrEqual(0);
fixture.componentInstance['selectTracePhase'](phaseIndex);
const decisionIndex = trace.phases[phaseIndex].decisions.findIndex(({ deltas }) =>
deltas.some(({ placement }) => placement?.balanceId.startsWith('earned:')),
);
fixture.componentInstance['selectTraceDecision'](decisionIndex);
fixture.componentInstance['showTraceMoment']('after');
expect(fixture.componentInstance['selectedTraceTransition']()?.after).toMatchObject({
calculationDate: '2024-05-01',
declaredDays: originalDeclarations,
});
root.querySelector<HTMLButtonElement>('.statistics-button')!.click();
await fixture.whenStable();
expect(connectedHolidays()).toBe('1');
@@ -541,9 +492,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
kind: 'PlanExplanation',
declaredDays: submitted.declaredDays,
});
expect((await calculation.trace)?.initialState.declaredDays).toEqual(
submitted.declaredDays,
);
const original = structuredClone(outcome);
const comparison = await calculation.analyzeCounterfactual(plan!.placements[0]);
for (const { date } of submitted.declaredDays)
@@ -577,10 +525,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
expect(outcome.incumbent).toBeUndefined();
expect(preparationUpdates).toBeGreaterThanOrEqual(2);
expect(stages).not.toContain('obligations');
expect(await calculation.trace).toMatchObject({
status: 'incomplete',
initialState: { declaredDays: [{ date: '2024-01-02', type: 'other' }] },
});
expect(await calculation.explanationError).toBeUndefined();
expect(heartbeats).toBeGreaterThan(0);
});
@@ -611,10 +555,9 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
});
if (outcome.kind !== 'PlanningIncomplete') return;
expect(outcome.incumbent).toBeUndefined();
expect((await calculation.trace)?.status).toBe('incomplete');
});
it('stops an active obligation search and retains a jointly valid incumbent and its history', async () => {
it('stops an active obligation search and retains a jointly valid incumbent', async () => {
let cancelledAt = 0;
afterCheckpoint = () => {
afterCheckpoint = undefined;
@@ -663,15 +606,9 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
);
expect(explanation.incomplete?.reason.code).toBe('user-cancelled');
}
const trace = await calculation.trace;
expect(trace?.status).toBe('incomplete');
expect(
trace?.phases.find((phase) => phase.name === 'obligations')?.decisions.length,
).toBeGreaterThan(0);
expect(trace?.phases.find((phase) => phase.name === 'dates')?.status).toBe('not-run');
});
it('preserves balances and provenance after a valid checkpoint and drains every produced trace packet', async () => {
it('preserves balances and provenance after a valid checkpoint', async () => {
const calculation = createPlanningCalculation({
horizon: { start: '2024-01-01', end: '2025-01-01' },
balances: [{ id: 'cp', type: 'cp', quantity: 3, expiryDate: '2024-12-31' }],
@@ -716,14 +653,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
expect(explanation.placements.map(({ placement }) => placement)).toEqual(
incumbent.placements,
);
const trace = await calculation.trace;
expect(trace?.status).toBe('incomplete');
expect(trace?.error?.code).toBe('user-cancelled');
expect(
trace?.phases.find(
(phase) => phase.name === 'optimization:default-non-working-day-gain',
)?.status,
).toBe('interrupted');
const frozenOutcome = structuredClone(outcome);
calculation.cancel();
expect(await calculation.outcome).toEqual(frozenOutcome);
@@ -750,7 +679,6 @@ parentPort.on('message', (data) => globalThis.self.onmessage({ data }));
const calculation = createPlanningCalculation(submitted);
expect(await calculation.outcome).toEqual(expected);
expect(simulatedElapsed).toBe(20_000);
expect((await calculation.trace)?.status).toBe('ready');
expect(await calculation.explanationError).toBeUndefined();
});
});