2026-06-16 11:13:52 +03:00
|
|
|
|
#!/usr/bin/env node
|
2026-06-12 18:26:17 +03:00
|
|
|
|
/**
|
|
|
|
|
|
* arbitration-card — чистый сборщик карточки арбитража (спека §6). Дословные цитаты обеих
|
2026-06-16 11:13:52 +03:00
|
|
|
|
* сторон + нейтральная строка «что меняет выбор» на каждый вариант + аффорданс. НЕ перефразирует.
|
|
|
|
|
|
* Решение владельца — через escape-grant/waivers (П3). Фикс 3: owner-seal + честный текст.
|
2026-06-12 18:26:17 +03:00
|
|
|
|
*/
|
|
|
|
|
|
export const ARBITRATION_OPTIONS = ['hold', 'accept', 'own'];
|
|
|
|
|
|
|
|
|
|
|
|
const verbatim = (s) => (typeof s === 'string' ? s : '');
|
|
|
|
|
|
|
2026-06-16 11:13:52 +03:00
|
|
|
|
export function buildArbitrationCard({ side, level, round, objectionVerbatim, controllerPositionVerbatim, sealAction = null } = {}) {
|
2026-06-12 18:26:17 +03:00
|
|
|
|
const who = side === 'judge' ? 'судьи' : 'наставника';
|
|
|
|
|
|
return {
|
2026-06-16 11:13:52 +03:00
|
|
|
|
side, level, round, sealAction,
|
2026-06-12 18:26:17 +03:00
|
|
|
|
title: `Арбитраж (${level}): тупик спора с ${side === 'judge' ? 'судьёй' : 'наставником'} после ${round} кругов`,
|
|
|
|
|
|
objection: verbatim(objectionVerbatim),
|
|
|
|
|
|
position: verbatim(controllerPositionVerbatim),
|
|
|
|
|
|
options: [
|
2026-06-16 11:13:52 +03:00
|
|
|
|
{ key: 'hold', label: 'Держусь позиции контроллера', whatChanges: `План/спека опечатывается по твоему решению (owner-seal); замечание ${who} отведено.` },
|
2026-06-12 18:26:17 +03:00
|
|
|
|
{ key: 'accept', label: 'Согласиться с замечанием', whatChanges: `Контроллер переделает по замечанию ${who}; счётчик круга сбрасывается.` },
|
2026-06-16 11:13:52 +03:00
|
|
|
|
{ key: 'own', label: 'Своё решение', whatChanges: 'Ты вписываешь своё указание; контроллер правит, затем печать по твоему решению (owner-seal).' },
|
2026-06-12 18:26:17 +03:00
|
|
|
|
],
|
|
|
|
|
|
explainAffordance: true,
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|