29 lines
1.3 KiB
JavaScript
29 lines
1.3 KiB
JavaScript
const { describe, it } = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const { extractCapabilityCandidates, expandSignals } = require('../src/gep/candidates');
|
|
|
|
describe('expandSignals', () => {
|
|
it('derives structured learning tags from weak signals', () => {
|
|
const tags = expandSignals(['perf_bottleneck', 'stable_success_plateau'], '');
|
|
assert.ok(tags.includes('problem:performance'));
|
|
assert.ok(tags.includes('problem:stagnation'));
|
|
assert.ok(tags.includes('action:optimize'));
|
|
});
|
|
});
|
|
|
|
describe('extractCapabilityCandidates', () => {
|
|
it('creates a failure-driven candidate from repeated failed capsules', () => {
|
|
const result = extractCapabilityCandidates({
|
|
recentSessionTranscript: '',
|
|
signals: ['perf_bottleneck'],
|
|
recentFailedCapsules: [
|
|
{ trigger: ['perf_bottleneck'], failure_reason: 'validation failed because latency stayed high', outcome: { status: 'failed' } },
|
|
{ trigger: ['perf_bottleneck'], failure_reason: 'constraint violation after slow path regression', outcome: { status: 'failed' } },
|
|
],
|
|
});
|
|
const failureCandidate = result.find(function (c) { return c.source === 'failed_capsules'; });
|
|
assert.ok(failureCandidate);
|
|
assert.ok(failureCandidate.tags.includes('problem:performance'));
|
|
});
|
|
});
|