41 lines
2.5 KiB
JavaScript
41 lines
2.5 KiB
JavaScript
// tools/secretary-apply.mjs
|
|
// Детерминированное применение результатов спана к реестру: садовник + новые ветки + кандидаты.
|
|
import { one } from './secretary-armor.mjs';
|
|
import { applyTend } from './secretary-gardener.mjs';
|
|
|
|
const norm = (s) => String(s || '').trim().toLowerCase().replace(/\s+/g, ' ');
|
|
|
|
/** Зажим тяжести: догадка не может быть блокером → важное (правило тяжести, находка №13). */
|
|
function clampSeverity(опора, тяжесть) {
|
|
return (one(опора) === 'догадка' && тяжесть === 'блокер') ? 'важное' : (тяжесть || 'важное');
|
|
}
|
|
|
|
/** Разложить результаты спана по реестру. Вход НЕ мутируется (работаем на копии). */
|
|
export function applyResults(proto, turn, d11, d12, d13, dG) {
|
|
const p = JSON.parse(JSON.stringify(proto));
|
|
p.hidden = p.hidden || []; p.nextSvId = p.nextSvId || 1; p.candidates = p.candidates || [];
|
|
|
|
// садовник (тенд по id; close без proof → carry — внутри applyTend)
|
|
applyTend(p, (dG && dG.tend) || [], turn);
|
|
|
|
// новые ветки из диагностики
|
|
for (const n of (d11 && d11.new) || []) {
|
|
p.hidden.push({ id: `СВ-${p.nextSvId++}`, lens: n.lens || 'Л?', status: 'открыт', text: String(n.text || ''), опора: one(n.опора), ref: n.ref || '', тяжесть: clampSeverity(n.опора, n.тяжесть), born: turn, lastTouch: turn, lineage: [] });
|
|
}
|
|
|
|
// ловец → долговечная ветка lens=брош
|
|
for (const dr of (d12 && d12.dropped) || []) {
|
|
p.hidden.push({ id: `СВ-${p.nextSvId++}`, lens: 'брош', status: 'открыт', text: String(dr.text || ''), опора: one(dr.опора), ref: dr.цитата || '', тяжесть: 'важное', born: turn, lastTouch: turn, lineage: [] });
|
|
}
|
|
|
|
// кандидаты — НАКАПЛИВАЮТСЯ (ход рождения, без дублей по branch), помечены слабыми (доживают до разбора)
|
|
const seen = new Set(p.candidates.map((c) => norm(c.branch)));
|
|
for (const f of (d13 && d13.forks) || []) {
|
|
if (seen.has(norm(f.branch))) continue;
|
|
seen.add(norm(f.branch));
|
|
p.candidates.push({ branch: f.branch, trigger: f.trigger, why: f.why, опора: one(f.опора), релевантность: f.релевантность || 'low', born: turn });
|
|
}
|
|
|
|
return p;
|
|
}
|