night: поручение работнику называет его настоящий предел часов, а не восемь

This commit is contained in:
Дмитрий
2026-08-05 12:42:20 +03:00
parent 66bfadbab3
commit de326eefaa
3 changed files with 43 additions and 7 deletions
+19 -4
View File
@@ -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 утра по Москве гасят всех,
кто ещё работает**, даже если твои часы не вышли.
И третье: тебя могут погасить, когда кончится **недельный запас** — общий на всё хозяйство.
Его не считают, а спрашивают у самой системы. Это не поломка и не твоя вина, так задумано:
+23 -2
View File
@@ -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», а слова для этого в списке
// из пяти нет. Незнакомое слово надзиратель читает как «работает» и ждёт до предела.
+1 -1
View File
@@ -144,7 +144,7 @@ export function buildWorkerSettings() {
//
// 🪤 И одних запретов МАЛО. Работник запускается безголово: согласия человека
// спросить не у кого. Без явного разрешающего списка `git commit` и прогон проверок
// упёрлись бы в отказ, и ни один пункт не закрылся бы за все восемь часов
// упёрлись бы в отказ, и ни один пункт не закрылся бы за всю ночь
// при зелёных проверках на «запреты держат». Поэтому разрешено ровно то, что нужно
// для закрытия пункта: правка файлов, свой коммит, свои проверки. Запрет сильнее
// разрешения, поэтому push, слияние и «наружу» остаются закрытыми.