397777089e
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
27 lines
1.9 KiB
JavaScript
27 lines
1.9 KiB
JavaScript
#!/usr/bin/env node
|
||
/**
|
||
* arbitration-card — чистый сборщик карточки арбитража (спека §6). Дословные цитаты обеих
|
||
* сторон + нейтральная строка «что меняет выбор» на каждый вариант + аффорданс «объясни
|
||
* подробнее». НЕ перефразирует: objection/position проходят как есть (только String-coerce).
|
||
* Решение владельца пишется НЕ здесь, а через escape-grant/waivers (П3).
|
||
*/
|
||
export const ARBITRATION_OPTIONS = ['hold', 'accept', 'own'];
|
||
|
||
const verbatim = (s) => (typeof s === 'string' ? s : '');
|
||
|
||
export function buildArbitrationCard({ side, level, round, objectionVerbatim, controllerPositionVerbatim } = {}) {
|
||
const who = side === 'judge' ? 'судьи' : 'наставника';
|
||
return {
|
||
side, level, round,
|
||
title: `Арбитраж (${level}): тупик спора с ${side === 'judge' ? 'судьёй' : 'наставником'} после ${round} кругов`,
|
||
objection: verbatim(objectionVerbatim),
|
||
position: verbatim(controllerPositionVerbatim),
|
||
options: [
|
||
{ key: 'hold', label: 'Держусь позиции контроллера', whatChanges: `Ворота пропустят версию контроллера — замечание ${who} отведено тобой (escape-грант).` },
|
||
{ key: 'accept', label: 'Согласиться с замечанием', whatChanges: `Контроллер переделает по замечанию ${who}; счётчик круга сбрасывается.` },
|
||
{ key: 'own', label: 'Своё решение', whatChanges: 'Ты вписываешь своё — оно становится обязательным для контроллера.' },
|
||
],
|
||
explainAffordance: true,
|
||
};
|
||
}
|