Take in the zone's dofix: the cut's reserve is checked against the walk it belongs to, and the register row the pack wrote no longer says the pack is unlanded
This commit is contained in:
parent
a80b076828
commit
08dd9187b1
4 changed files with 101 additions and 3 deletions
File diff suppressed because one or more lines are too long
|
|
@ -7,13 +7,68 @@
|
|||
|
||||
| Вопрос | Ответ |
|
||||
|---|---|
|
||||
| последний заленджённый пак | «деньги и правда на экране» (06–07.09, `fda0679`, акт **D39.221**), канон контракта `0.13.0`. ⚠ Обе величины берутся ПРИБОРОМ, а не отсюда: `git log --oneline -1 -- platform/` и `grep '^ version:' ../../docs/architecture/14-api-contract/openapi.yaml` — эта строка стареет, они нет |
|
||||
| пак в дереве, не закоммиченный | «разрез приёма до готовности и правда о себе» (08.09) — отчёт ниже |
|
||||
| последний заленджённый пак | «разрез приёма до готовности и правда о себе» (08.09, `ddcbf0c`, акт **D39.229**), канон контракта `0.13.0`. ⚠ Обе величины берутся ПРИБОРОМ, а не отсюда: `git log --oneline -1 -- platform/` и `grep '^ version:' ../../docs/architecture/14-api-contract/openapi.yaml` — эта строка стареет, они нет. ⭐ И стареет она БЫСТРЕЕ, чем кажется: её уже правил этот пак по §4.5, и лендинг того же пака сделал её неверной снова — читай прибором, а не глазами |
|
||||
| пак в дереве, не закоммиченный | дофикс по паку «разрез приёма» (две позиции, 08.09) — отчёт ниже |
|
||||
| открытые дефекты | `DEFECT_REGISTER.md` (счёт — `python3 docs/scripts/counts.py` от корня) |
|
||||
| нормы и приёмка | `ENGINEERING_STANDARDS.md` · направление — `PLATFORM_DIRECTION.md` · стек и стенд — `STACK_DECISIONS.md` |
|
||||
| незакрытые куски работы | `../BACKLOG.md` (`П-N`) |
|
||||
| как разворачивается | `../deploy/README.md` |
|
||||
|
||||
## ДОФИКС ПО ПАКУ «РАЗРЕЗ ПРИЁМА» — ДВЕ ПОЗИЦИИ (08.09, `textmachine-fa`, после лендинга `ddcbf0c`)
|
||||
|
||||
> Заказ оркестратора №23: он закрывал пробел в СВОЕЙ приёмке (норма требует двух верификаторов по
|
||||
> сданной работе, он их не поставил и поставил задним числом), и слепой верификатор нашёл две вещи в
|
||||
> моей зоне. Обе я пере-проверила прежде, чем чинить. Правило остановки объявлено заказчиком заранее:
|
||||
> дофикса ровно два, дальнейшее — строка бэклога.
|
||||
|
||||
**1. Рукописная тройка в резерве — класс `D39.216` ВНУТРИ пака, нанятого его убрать.**
|
||||
`cutTailReserve()` возвращал `3 * s.write()`, где тройка — ручной счёт записей, следующих за разрезом,
|
||||
и жила она только в докстринге. Замер подтверждён мной: **0 хитов в тестах** при 3 хитах в не-тестах.
|
||||
Четвёртая пост-разрезная запись — и резерв тихо недокрывает, а последствие называет ⛔-абзац моего же
|
||||
`stepLeaving`: оборванная терминальная запись, книга в `parsing` без задания до свипа.
|
||||
|
||||
⇒ Выбрана вторая из двух названных форм — **тройка ПИНИТСЯ**, а не выводится. Довод против первой,
|
||||
чтобы он не пропал: вывести резерв структурно значит дать прогулке список её оставшихся шагов, то есть
|
||||
вернуть тот самый рукописный перечень одним уровнем ниже. Вместо этого — сверка с ДРУГИМ выражением
|
||||
того же факта: `UploadSettle` уже собирает прогулку из разреза и четырёх записей, ровно одна из
|
||||
которых (`StartParsing`) идёт ДО разреза, значит резерв обязан равняться остатку прогулки после выноса
|
||||
разреза и этой одной записи. **Два выражения делят константы, но не маршрут** — потому это сверка, а
|
||||
не тавтология.
|
||||
|
||||
Предъявлено посадкой: пятая запись, добавленная в `UploadSettle` и НЕ добавленная в счёт, красит
|
||||
`TestTheCutsReserveIsTheWalkMinusTheCutAndTheWriteBeforeIt` — и он **ЕДИНСТВЕННЫЙ красный** на трёх
|
||||
пакетах (`books`, `config`, `httpapi`), текстом: «the cut reserves 1m30s … but the walk (4m0s) has
|
||||
2m0s left once the cut and the write before it are taken out».
|
||||
|
||||
**2. `PD-464` нёс ровно ту протухшую фразу, которую пак снял с трёх других рядов.**
|
||||
Диспозиция говорила «(08.09, в дереве, статус флипает лендинг)» при колонке статуса `fixed` и
|
||||
состоявшемся лендинге. Замер: рядов с этой фразой в файле был **ровно один — мой собственный**.
|
||||
Приведена к лендингу (`ЗАЛАНДЁН ddcbf0c, акт D39.229`); теперь фразы в файле **0** при 465 рядах,
|
||||
колонок ≠ 7 — **0**, `counts.py --check` — **EXIT=0**.
|
||||
|
||||
⭐ **Класс, из-за которого это уцелело, стоит назвать: норма §4.5 сработала на ТРЁХ чужих рядах и не
|
||||
сработала на ОДНОМ моём.** Ряд я писала сама и потому не подпала под собственную правку. Тот же класс
|
||||
оркестратор поймал у себя часом раньше на строке 253. Общее правило: **проход по норме обязан включать
|
||||
строки, которые этот же проход и создал** — иначе он чистит только унаследованное.
|
||||
|
||||
**Числа дофикса, сняты после последней правки кода:** `make check` со всеми четырьмя гейтами —
|
||||
**MAKE-EXIT=0** · пакетов `ok` **20** · строк FAIL **0** · линтер «**0 issues**» · скипов **5** (условие
|
||||
прежнее и названное). Моих файлов в дереве — **4, все в `platform/`**. ⚠ `git status` показывает **7**: остальные три
|
||||
(`docs/BACKLOG.md`, `docs/ORCHESTRATOR_SESSION_PROMPT.md`, `docs/architecture/05-decisions-log.md`) —
|
||||
живая работа оркестратора в ЕГО зоне, идущая параллельно. Не мои и не тронуты; называю их, чтобы «все в
|
||||
моей зоне» не читалось как «в дереве больше ничего нет». Якоря дофикс НЕ сдвинул: 7 проблемных на
|
||||
`HEAD` и 7 у меня, новых ноль (замер дифференциальный, как в основном отчёте).
|
||||
⚠ Код выхода взят на этот раз ВЕРНО и подтверждён вторым источником: в прошлый раз я написала
|
||||
`echo "MAKE-EXIT=$?"` после подстановки `$(git rev-parse …)`, и `$?` ловил код `git`, а не `make` —
|
||||
напечатанный ноль не значил ничего. Теперь `st=$?` стоит сразу за `make`, и рядом вердикт самой цели:
|
||||
`make check` СОХРАНЯЕТ `.check.log.<pid>` при провале и удаляет при успехе, лога нет.
|
||||
|
||||
**Попутно — прибрала свой мусор на общем стенде.** Убитые прогоны (в том числе мой, когда я гасила
|
||||
зависший пакет) оставили в общем Postgres **34** скретч-базы ≈9,5 МБ каждая. Удалены все 34, отказов
|
||||
**0**, осталось **0**. ⚠ Инструмент выбран самоохраняющийся: обычный `drop database` БЕЗ `with (force)`
|
||||
— он ОТКАЖЕТ, если между листингом и дропом кто-то подключился, вместо того чтобы выдернуть базу из-под
|
||||
чужого прогона. Верификатор не стал их трогать именно из-за этого риска, и это была верная осторожность.
|
||||
|
||||
## ПАК «РАЗРЕЗ ПРИЁМА ДО ГОТОВНОСТИ И ПРАВДА О СЕБЕ» — ОТЧЁТ (08.09, `textmachine-fa`)
|
||||
|
||||
> Промт `docs/PLATFORM_INTAKE_TRUTH_SESSION_PROMPT.md`, вход HEAD `3f4680c`, дерево на входе чисто.
|
||||
|
|
|
|||
|
|
@ -499,6 +499,15 @@ func (s *Service) stepLeaving(ctx context.Context, budget, reserve time.Duration
|
|||
// test shortens the write budget to reach cases a thirty-second one cannot, and a reserve pinned to
|
||||
// the constant would then be three real writes' worth of a walk measured in milliseconds — that is,
|
||||
// larger than the whole walk, so no cut would ever run and the fixture would silently model nothing.
|
||||
//
|
||||
// ⚠ The THREE is a count of the writes that follow a cut, and a count in code is exactly what this
|
||||
// intake's budgets were rewritten to stop relying on. It is kept because the alternative — deriving
|
||||
// the reserve at run time — needs the walk to enumerate the steps it has left, which is the
|
||||
// hand-written list all over again, one level down. What replaces the missing structure is a check
|
||||
// against the OTHER expression of the same fact: UploadSettle already composes the walk out of a cut
|
||||
// and four writes, so the reserve must equal what is left of the walk once the cut and the ONE write
|
||||
// that precedes it (StartParsing) are taken out. A write added to that sum and not to this count
|
||||
// makes the two disagree, and TestTheCutsReserveIsTheWalkMinusTheCutAndTheWriteBeforeIt says so.
|
||||
func (s *Service) cutTailReserve() time.Duration { return 3 * s.write() }
|
||||
|
||||
// write is the budget one terminal write gets: the constant, or what a test shortened it to.
|
||||
|
|
|
|||
|
|
@ -152,3 +152,37 @@ func TestTheCutOfAnUploadIsBoundedByTheWalkAndNotByItsOwnBudget(t *testing.T) {
|
|||
granted, CutBudget)
|
||||
}
|
||||
}
|
||||
|
||||
// The reserve a cut leaves behind is the same fact as UploadSettle's own composition, reached the
|
||||
// other way round.
|
||||
//
|
||||
// ⛔ Why this exists at all: `cutTailReserve` counts the writes after a cut BY HAND (a literal three),
|
||||
// and a hand count in code is what this intake's budgets were rewritten to stop relying on — the
|
||||
// class that made UploadSettle short three editions running. The count cannot be replaced by a
|
||||
// derivation without giving the walk a list of its remaining steps, which is the hand-written list
|
||||
// again one level down. So it is CROSS-CHECKED instead: UploadSettle composes the walk out of one
|
||||
// cut and four writes, exactly one of which (StartParsing) runs before the cut, so the reserve must
|
||||
// be what is left after removing the cut and that one write.
|
||||
//
|
||||
// The two expressions share the constants and NOT the route, which is what makes this a check rather
|
||||
// than a tautology: add a fifth write to UploadSettle and the derived side grows while the literal
|
||||
// three does not, so this test — and only this test — turns red.
|
||||
func TestTheCutsReserveIsTheWalkMinusTheCutAndTheWriteBeforeIt(t *testing.T) {
|
||||
s := &Service{}
|
||||
walk := UploadSettle - ReceiptBudget
|
||||
want := walk - CutBudget - writeBudget
|
||||
if got := s.cutTailReserve(); got != want {
|
||||
t.Errorf("the cut reserves %s for the writes after it, but the walk (%s) has %s left once the cut (%s) "+
|
||||
"and the write before it (%s) are taken out.\n"+
|
||||
"The two disagree, which means UploadSettle and cutTailReserve no longer count the same steps: "+
|
||||
"a write was added to one of them and not to the other. Whichever grew, the reserve is now wrong — "+
|
||||
"too small truncates the write that records what the cut found, too large starves the cut itself.",
|
||||
got, walk, want, CutBudget, writeBudget)
|
||||
}
|
||||
// And the shortened form a test uses stays proportional, or every short-walk fixture silently
|
||||
// models a walk with no room for a cut at all (the hang this pack's own repair introduced).
|
||||
short := &Service{writeBudget: 25 * time.Millisecond}
|
||||
if got, want := short.cutTailReserve(), 3*25*time.Millisecond; got != want {
|
||||
t.Errorf("with a shortened write budget the reserve is %s, want %s", got, want)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue