feat(brain): surface router-gate v4 signals into episode + factor axes
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
This commit is contained in:
@@ -17,6 +17,21 @@ import {
|
||||
classifyFilePath,
|
||||
} from './observer-transcript-parser.mjs';
|
||||
|
||||
describe('v4_signals + judge_spend_usd in episode', () => {
|
||||
it('episode carries v4_signals block (default zero/null when no runtime files)', () => {
|
||||
const ep = parseTranscript(JSON.stringify({
|
||||
sessionId: 'no-runtime-sess',
|
||||
message: { role: 'user', content: 'сделай фичу X' },
|
||||
timestamp: '2026-05-31T10:00:00.000Z',
|
||||
}), null, { routerStateBaseDir: tmpdir() });
|
||||
expect(ep.v4_signals).toEqual({
|
||||
rationalization_flag_count: 0, judge_verdict: null, safe_baseline_action: null, judge_calls: 0,
|
||||
});
|
||||
expect(typeof ep.task_cost.judge_spend_usd).toBe('number');
|
||||
expect(ep.schema_minor).toBe(4);
|
||||
});
|
||||
});
|
||||
|
||||
// Build a JSONL transcript string from entry objects.
|
||||
function jsonl(entries) {
|
||||
return entries.map((e) => JSON.stringify(e)).join('\n');
|
||||
@@ -236,7 +251,7 @@ describe('parseTranscript', () => {
|
||||
expect(ep.events).toEqual([]);
|
||||
expect(ep.outcome).toBe('unknown');
|
||||
expect(ep.schema_version).toBe(4);
|
||||
expect(ep.schema_minor).toBe(3);
|
||||
expect(ep.schema_minor).toBe(4);
|
||||
});
|
||||
|
||||
it('produces a complete 7-field primary_rationale', () => {
|
||||
@@ -469,7 +484,7 @@ describe('parseTranscript — v4 episode (Phase 2 Task 15 bump)', () => {
|
||||
]);
|
||||
const ep = parseTranscript(t);
|
||||
expect(ep.schema_version).toBe(4);
|
||||
expect(ep.schema_minor).toBe(3);
|
||||
expect(ep.schema_minor).toBe(4);
|
||||
expect('classifier_output' in ep).toBe(true);
|
||||
expect('degraded_mode' in ep).toBe(true);
|
||||
expect('classifier_model' in ep.environment).toBe(true);
|
||||
@@ -1047,6 +1062,7 @@ describe('parseTranscript — task_cost integration (Task 2)', () => {
|
||||
self_assessment_input_tokens: 0, self_assessment_output_tokens: 0,
|
||||
reviewer_input_tokens: 0, reviewer_output_tokens: 0,
|
||||
reviewer_subagent_usd: 0, reviewer_direct_fallback_usd: 0,
|
||||
judge_spend_usd: 0,
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1657,7 +1673,7 @@ describe('parseTranscript v3 fields', () => {
|
||||
it('emits schema_version: 4', () => {
|
||||
const ep = parseTranscript(transcriptDirectFeature(), 'sess-1');
|
||||
expect(ep.schema_version).toBe(4);
|
||||
expect(ep.schema_minor).toBe(3);
|
||||
expect(ep.schema_minor).toBe(4);
|
||||
});
|
||||
|
||||
it('recommended_node is null on direct episode without router-state (no classifier signal)', () => {
|
||||
@@ -1772,9 +1788,9 @@ describe('parseTranscript — schema v4.3 write-block fields (phase 3 deferred #
|
||||
].join('\n');
|
||||
}
|
||||
|
||||
it('emits schema_minor 3', () => {
|
||||
it('emits schema_minor 4', () => {
|
||||
const ep = parseTranscript(simpleTranscript());
|
||||
expect(ep.schema_minor).toBe(3);
|
||||
expect(ep.schema_minor).toBe(4);
|
||||
});
|
||||
|
||||
it('emits outcome_reviewed: null', () => {
|
||||
|
||||
Reference in New Issue
Block a user