Files
portal/tools/missed-activations.test.mjs
T

79 lines
2.9 KiB
JavaScript

// tools/missed-activations.test.mjs
import { describe, it, expect } from 'vitest';
import { detectMissedActivations } from './missed-activations.mjs';
const map = {
refactor: ['#11', '#12', '#43'],
bugfix: ['#18', '#34'],
feature: ['#19'],
other: [],
};
const dormancy = { '#11': false, '#12': false, '#43': false, '#18': false, '#34': false, '#19': false };
function ep(classification, node_chosen) {
return {
schema_version: 2,
primary_rationale: { task_classification: classification, node_chosen },
};
}
describe('detectMissedActivations', () => {
it('counts an episode with profile classification + node_chosen=direct as missed', () => {
const result = detectMissedActivations([ep('refactor', 'direct')], map, dormancy);
expect(result.totalMissed).toBe(1);
expect(result.byNode).toEqual({ '#11': 1, '#12': 1, '#43': 1 });
});
it('does NOT count episode when the recommended node IS chosen', () => {
const result = detectMissedActivations([ep('refactor', '#11')], map, dormancy);
expect(result.totalMissed).toBe(0);
});
it('does NOT count episode when classification=other (empty list)', () => {
const result = detectMissedActivations([ep('other', 'direct')], map, dormancy);
expect(result.totalMissed).toBe(0);
});
it('excludes dormant (DEFERRED) nodes from recommendations', () => {
const dorm = { ...dormancy, '#43': true };
const result = detectMissedActivations([ep('refactor', 'direct')], map, dorm);
expect(result.byNode).toEqual({ '#11': 1, '#12': 1 });
expect(result.totalMissed).toBe(1);
});
it('returns totalMissed=0 when ALL recommended nodes are dormant', () => {
const dorm = { '#11': true, '#12': true, '#43': true };
const result = detectMissedActivations([ep('refactor', 'direct')], map, dorm);
expect(result.totalMissed).toBe(0);
expect(result.byNode).toEqual({});
});
it('ignores schema v1 episodes (no factor analysis)', () => {
const v1 = { schema_version: 1, primary_rationale: { task_classification: 'refactor', node_chosen: 'direct' } };
const result = detectMissedActivations([v1], map, dormancy);
expect(result.totalMissed).toBe(0);
});
it('ignores observer_error markers', () => {
const err = { observer_error: true };
const result = detectMissedActivations([err], map, dormancy);
expect(result.totalMissed).toBe(0);
});
it('ignores unknown classification (not in map)', () => {
const result = detectMissedActivations([ep('unknown-bucket', 'direct')], map, dormancy);
expect(result.totalMissed).toBe(0);
});
it('aggregates byClassification breakdown for the report', () => {
const eps = [
ep('refactor', 'direct'),
ep('refactor', 'direct'),
ep('bugfix', 'direct'),
];
const result = detectMissedActivations(eps, map, dormancy);
expect(result.byClassification).toEqual({ refactor: 2, bugfix: 1 });
expect(result.totalMissed).toBe(3);
});
});