Skip to content

Commit 3b06245

Browse files
fix: dedupe streamed annual llm signals
1 parent baef701 commit 3b06245

2 files changed

Lines changed: 28 additions & 3 deletions

File tree

frontend/app.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ function mergeAnnualSignals(year, signals){
141141
if (chart.annual_scans[si].year === year){
142142
if (!chart.annual_scans[si].events) chart.annual_scans[si].events = [];
143143
for (let sj = 0; sj < signals.length; sj++){
144+
if (_isDuplicateLlmSignal(chart.annual_scans[si].events, signals[sj])) continue;
144145
chart.annual_scans[si].events.push(signals[sj]);
145146
}
146147
break;
@@ -150,6 +151,25 @@ function mergeAnnualSignals(year, signals){
150151
return chart;
151152
}
152153

154+
function _isDuplicateLlmSignal(existingSignals, candidate){
155+
if (!candidate || candidate.source !== 'llm') return false;
156+
let candidateKey = _annualSignalKey(candidate);
157+
for (let i = 0; i < existingSignals.length; i++){
158+
let signal = existingSignals[i];
159+
if (signal && signal.source === 'llm' && _annualSignalKey(signal) === candidateKey) return true;
160+
}
161+
return false;
162+
}
163+
164+
function _annualSignalKey(signal){
165+
let triggers = Array.isArray(signal.triggers) ? signal.triggers.join('\u001f') : '';
166+
let notes = Array.isArray(signal.notes) ? signal.notes.join('\u001f') : '';
167+
return [
168+
signal.category || '', signal.direction || '', signal.strength || 0,
169+
signal.prediction || '', triggers, notes,
170+
].join('\u0001');
171+
}
172+
153173
function setDayunInterpretations(items){
154174
let chart = getChartData();
155175
if (!chart) return null;

scripts/tests/test_frontend_personality_ui.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,7 +1385,10 @@ class Element {{
13851385
const chart = {{
13861386
id: 'fresh-chart',
13871387
current_context: {{ current_dayun: {{ ganzhi: 'bingwu' }} }},
1388-
annual_scans: [{{ year: 2026, events: [{{ category: 'base', strength: 2 }}] }}],
1388+
annual_scans: [{{ year: 2026, events: [
1389+
{{ category: 'base', strength: 2 }},
1390+
{{ category: 'stream', direction: 'positive', strength: 3, prediction: 'same', triggers: ['trigger'], notes: ['note'], source: 'llm' }}
1391+
] }}],
13891392
dayun: {{ interpretations: [] }}
13901393
}};
13911394
@@ -1395,9 +1398,11 @@ class Element {{
13951398
if (!vm.runInContext('CHAT.chartData === getChartData()', sandbox)) throw new Error('legacy chat chart was not synchronized');
13961399
if (sandbox.window._calChart !== chart) throw new Error('legacy calendar chart was not synchronized');
13971400
1398-
sandbox.mergeAnnualSignals(2026, [{{ category: 'stream', strength: 3 }}]);
1401+
sandbox.mergeAnnualSignals(2026, [{{ category: 'stream', direction: 'positive', strength: 3, prediction: 'same', triggers: ['trigger'], notes: ['note'], source: 'llm' }}]);
13991402
if (chart.current_context.current_dayun.ganzhi !== 'bingwu') throw new Error('current_context changed during annual merge');
1400-
if (chart.annual_scans[0].events.length !== 2) throw new Error('annual stream signal was not merged');
1403+
if (chart.annual_scans[0].events.length !== 2) throw new Error('duplicate LLM stream signal was appended');
1404+
sandbox.mergeAnnualSignals(2026, [{{ category: 'stream', direction: 'positive', strength: 3, prediction: 'different', triggers: ['trigger'], notes: ['note'], source: 'llm' }}]);
1405+
if (chart.annual_scans[0].events.length !== 3) throw new Error('distinct LLM stream signal was not merged');
14011406
14021407
sandbox.setDayunInterpretations([{{ index: 0, text: 'ok' }}]);
14031408
if (chart.current_context.current_dayun.ganzhi !== 'bingwu') throw new Error('current_context changed during dayun merge');

0 commit comments

Comments
 (0)