diff --git a/tools/night/worker-prompt.mjs b/tools/night/worker-prompt.mjs index 1a6dfd31..6736803e 100644 --- a/tools/night/worker-prompt.mjs +++ b/tools/night/worker-prompt.mjs @@ -2,6 +2,11 @@ // написан ему, а не машине. Он не видит ни одного модуля затеи: всё, что он о ней знает, — // написано здесь, а разговаривает он с надзирателем только файлами почтового ящика. +// 🔴 Единственный ввоз в этот файл, и он нарочно узкий: одно число — предел часов работнику +// (решение владельца 37). Числа, которые работник читает про себя, не вписываются сюда +// словами: вписанное слово переживает отмену числа молча. +import { PREDEL_CHASOV_SUTKI } from './limits.mjs'; + // 🔴 Закрытый список из договора о стыках. Менять нельзя ни в одном слове. // 🆕 Долг перед куском 5 (проверка П4): пара «метка + фраза» в одной записи, а не два // отдельных списка в двух файлах. `text` идёт в текст поручения (ниже), `kind` — та же @@ -119,6 +124,12 @@ export function buildWorkerPrompt({ // 🆕 Кусок 6: необязательные доводы. Не поданы — текст поручения ПРЕЖНИЙ, слово в слово. resumeFrom = null, assumptionLenta = null, + // 🔴 Решение владельца 37 (08.08.2026). Прежде число часов было ВПИСАНО В ТЕКСТ словом + // «восемь» — и это самый вредный род спрятанного числа во всей затее: поручение читает сам + // работник, и он поверил бы, что у него восемь часов, даже когда предел уже подняли. + // Умолчание берётся из `limits.mjs` — из того же места, откуда запасное число берёт + // надзиратель, чтобы обещанное работнику и то, по чему его гасят, не разъехались молча. + chasovPredel = PREDEL_CHASOV_SUTKI, }) { if (!item?.tests?.length) { throw new Error(`Для пункта ${item?.id ?? '?'} в плане не записано ни одной проверки — закрыть его нельзя, значит и поручать нечего.`); @@ -389,13 +400,17 @@ ${tests} ## Сколько у тебя времени -Часов у тебя восемь. Считается только работа: пока ты ждёшь чужую службу или стоишь -без дела в ожидании ответа владельца, это время в восемь часов не идёт. Когда восемь часов +Часов у тебя ${chasovPredel}. Считается только работа: пока ты ждёшь чужую службу или стоишь +без дела в ожидании ответа владельца, это время в твой предел не идёт. Когда ${chasovPredel} ч выйдут, тебя погасят посреди дела — так задумано. Сделанное останется в твоей ветке, и продолжат с последнего закрытого тобой пункта. -Ещё одно: **в 8 утра по Москве гасят всех, кто ещё работает**, даже если восемь часов -не вышли. +🔴 Этот предел — **последняя сеть, а не срок работы**. Тебя не торопят и не обрывают +на полпути: работай, пока не доведёшь пункт до конца. Гасят раньше предела только +за пустую трату — когда ты топчешься на месте и дело не двигается. + +Ещё одно, и на деле это тебя коснётся раньше предела: **в 8 утра по Москве гасят всех, +кто ещё работает**, даже если твои часы не вышли. И третье: тебя могут погасить, когда кончится **недельный запас** — общий на всё хозяйство. Его не считают, а спрашивают у самой системы. Это не поломка и не твоя вина, так задумано: diff --git a/tools/night/worker-prompt.test.mjs b/tools/night/worker-prompt.test.mjs index e3aa5f82..5d43fa1d 100644 --- a/tools/night/worker-prompt.test.mjs +++ b/tools/night/worker-prompt.test.mjs @@ -1,5 +1,6 @@ import { describe, it, expect } from 'vitest'; import { buildWorkerPrompt, buildSmokePrompt, STOP_AND_ASK, sverkaPometok } from './worker-prompt.mjs'; +import { PREDEL_CHASOV_SUTKI } from './limits.mjs'; const base = { workerId: 'w-1', @@ -101,14 +102,34 @@ describe('buildWorkerPrompt', () => { }); it('говорит, сколько у работника часов и что в 8 утра гасят всех', () => { - // 🪤 Прежде работника гасили посреди дела, не сказав ему заранее ни про восемь часов, + // 🪤 Прежде работника гасили посреди дела, не сказав ему заранее ни про предел часов, // ни про отсечку. Он и брался за куски, которые заведомо не успевал довести до коммита. + // + // 🔴 08.08.2026, решение владельца 37: слово «восемь» из ожидания убрано. Проверка + // не удалена и замысел её тот же — работник обязан узнать свой предел ЗАРАНЕЕ, — но + // требовать в поручении именно восьмёрку значило бы приказывать работнику жить + // по отменённому числу. const p = buildWorkerPrompt(base); - expect(p).toMatch(/восемь часов/i); expect(p).toMatch(/8 утра|8:00/); expect(p).toMatch(/по одному и целиком/i); }); + it('🔴 решение 37: поручение называет работнику ЕГО СУТКИ, а не заученные восемь часов', () => { + // Это не комментарий, а живой текст, который читает сам работник. Останься в нём + // «восемь часов» — работник поверил бы, что у него их восемь, и не брался бы + // за работу, которую на деле успевает. + const p = buildWorkerPrompt(base); + expect(p).not.toMatch(/восемь часов/i); + expect(p).toMatch(new RegExp(`${PREDEL_CHASOV_SUTKI}`)); + }); + + it('🔴 решение 37: предел в поручении и предел, по которому гасят, — одно число', () => { + // Разъедутся молча — работнику пообещают одно, а погасят по другому. + const p = buildWorkerPrompt({ ...base, chasovPredel: 11 }); + expect(p).toMatch(/11/); + expect(buildWorkerPrompt(base)).toMatch(new RegExp(`${PREDEL_CHASOV_SUTKI} `)); + }); + it('даёт слово, которым работник объявляет «дела кончились», — и оно из закрытого списка', () => { // 🪤 Прежде было велено «напиши об этом в status.json», а слова для этого в списке // из пяти нет. Незнакомое слово надзиратель читает как «работает» и ждёт до предела. diff --git a/tools/night/workspace.mjs b/tools/night/workspace.mjs index 99292367..d5a0d6a0 100644 --- a/tools/night/workspace.mjs +++ b/tools/night/workspace.mjs @@ -144,7 +144,7 @@ export function buildWorkerSettings() { // // 🪤 И одних запретов МАЛО. Работник запускается безголово: согласия человека // спросить не у кого. Без явного разрешающего списка `git commit` и прогон проверок - // упёрлись бы в отказ, и ни один пункт не закрылся бы за все восемь часов — + // упёрлись бы в отказ, и ни один пункт не закрылся бы за всю ночь — // при зелёных проверках на «запреты держат». Поэтому разрешено ровно то, что нужно // для закрытия пункта: правка файлов, свой коммит, свои проверки. Запрет сильнее // разрешения, поэтому push, слияние и «наружу» остаются закрытыми.