textmachine/platform/docs/p8-review/README.md

102 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Артефакты пака P8-REVIEW (24.08.2026)
Скрипты и снимки, которыми воспроизводятся находки пака (`PD-375``PD-395` и ⚠-дописки к
существующим строкам). Лежат в репозитории намеренно: строка регистра, чьё «воспроизведение»
существует только текстом, воспроизведением не является.
## Стенд, на котором всё снято
Postgres 18.4 без root (`~/.local/pgsql`, сокет `/tmp`, порт 55433) · движок `tmctl` и шаблон книги
собраны по рецепту `../STACK_DECISIONS.md`, раздел «Стенд разработчика» · дев-демон координатора на
`127.0.0.1:8099`, метрики `127.0.0.1:9464` · по своей копии дерева, своей базе и своей паре портов
на каждого из восьми субагентов.
Базовая линия снята на дереве репозитория при ТРЁХ выполненных гейтах (DSN · пара
`TM_PLATFORM_TEST_ENGINE_BIN`+`_BOOK_TEMPLATE` · достижимый менеджер systemd пользователя);
числа прогона — строка `battery-final.log` таблицы ниже.
## ⚠ Два правила, без которых мутации читаются неверно
1. **Копия `platform/`, вынутая из репозитория, даёт ДВА возможных красных, не связанных с кодом:**
`gates.TestTheAnnouncedContractVersionIsTheOneTheCanonRatified` (гейт читает канон по пути ВЫШЕ
модуля — постоянный, заведён строкой `PD-395`) и `runner.TestARunIsBoundedByItsOwnCgroup`
(грабли стенда: опустевший `cgroup.subtree_control` у `tm.slice`, лечится строкой из рецепта).
Поэтому мутация судится по **ДЕЛЬТЕ** против чистой базовой линии ТОЙ ЖЕ копии, а не по
«батарея красная» и не по exit-коду.
2. **Вердикт выносится по ТОПИЧНОСТИ упавшего теста, а не по цвету.** У пака это стоило одной
ошибки: мутация `ClearSession` покраснела на `TestAClaimThatLostARaceToAReleaseIsRetriedAndNotAnError`
— известном флейке `PD-369`, к куке отношения не имеющем. Ложное «пойман» ТИХО теряет находку о
недостающем пине.
## Как пере-снять мутации координатора
```sh
export P8_REPO=<репо>/platform
export P8_COPY=~/tm-p8-review/mine/platform
mkdir -p ~/tm-p8-review/mine && cp -a "$P8_REPO" "$P8_COPY"
export TM_PLATFORM_TEST_DSN='postgres://postgres@/<своя база>?host=/tmp&port=55433&sslmode=disable'
export TM_PLATFORM_TEST_ENGINE_BIN=~/tmstand-work/tmctl
export TM_PLATFORM_TEST_BOOK_TEMPLATE=~/tmstand-work/book-template.yaml
python3 plant.py M8 plant && (cd "$P8_COPY" && go test ./... -count=1); python3 plant.py M8 revert
P8_OUT=. ./run-round2.sh # девять посадок разом, с чистой базовой линией и судом по дельте
```
`plant.py` знает M1M16 поимённо, репозиторий не трогает никогда (откат — копирование из `P8_REPO`).
## Что где лежит
### Корень — работа координатора пака
| Файл | Что доказывает |
|---|---|
| `battery-final.log` | сдаваемый прогон батареи: 18 пакетов, EXIT=0, скипов 0, линтер 0 issues |
| `reconcile-two-ways.sh` | сводит баланс, сумму леджера и открытые холды ДВУМЯ независимыми путями — тем, что отвечает платформа, и прямым SQL по сырому леджеру |
| `reconcile-with-open-hold.txt` | **обязательная норма промта**: сведение на НЕТРИВИАЛЬНОМ состоянии — 8 строк леджера и ОТКРЫТЫЙ холд $0.06 в момент замера, оба пути сошлись |
| `reconcile-after-settle.txt` | то же сведение после закрытия холда |
| `plant.py` · `run-mutations.sh` · `run-full-mutations.sh` · `run-round2.sh` | харнесс посадок и три прогона |
| `mutations.log` · `mutations-full.log` · `mutations-round2.log` | их результаты; в третьем — чистая базовая линия копии и суд по дельте |
| `agent-mutations.md` | таблицы 42 посадок восьми субагентов (⚠ сырые логи их прогонов НЕ сохранены) |
| `pd23-retention-probe.sh` · `pd23-result.txt` | ретенция журнала входов РАБОТАЕТ: строка возрастом 200 суток исчезла на ближайшем тике, демон напечатал `"login sweep" events=1` |
| `sse-origin-probe.txt` | SSE-хендшейк с ЧУЖИМ `Origin` и амбиентной кукой отвечает 200 и стримит (`PD-6`) |
| `sse-outlives-revocation.txt` | отозванная сессия получает кадр данных через 9 секунд после `revoke` (`PD-379`) |
### `axis1-money/` — деньги и леджер
Готовые пины к `PD-376` (`a1_spendbound_test.go.txt`, независимый `r1_spendbound_test.go.txt`) ·
воспроизведение `PD-375` (`a1-mut5-ceiling-bound.sh`, `r1_ceiling_bound_test.go.txt`,
`a1-full-battery-under-MUT5.log`) · `PD-377` (`a1-ceiling-column-doc.sql`) · `PD-378`
(`a1-usage-overflow.sh`, сам откатывает грант; порог — `r1_usage_threshold_test.go.txt`) ·
проба констрейнтов денежных таблиц (`constraint-probe.sh` + `.out`).
### `axis2-auth/` — вход, сессии, CSRF
`sse-outlives-revocation.sh` и `sse-outlives-absolute-ceiling.sh` плюс независимые рефутерские
`refute-*` — четыре независимых воспроизведения `PD-379` · `mutations-axis2.sh` (шесть посадок,
несёт гард «refusing to mutate the live repository») · `csrf-matrix.sh` и `session-clocks-probe.sh`
— матрица CSRF по маршрутам и поведение обоих потолков на границах.
### `axis3-queue/` — очередь и джобы
Пробы на РЕАЛЬНЫХ функциях с реальным Postgres: `probe_settlement_surface_test.go.txt` (`PD-384`),
`probe_sweep_serialisation_test.go.txt` (`PD-386`, 40 тактов против 9),
`probe_drain_budget_pair_test.go.txt` (`PD-388`) · `live-stalled-settlement.sh` (`PD-385`, состояние
выращено штатными путями) · `mutations.sh` и `mutations-refuter.sh` · рефутерские пины
`refute_*_test.go.txt`.
### `axis4-metrics/` — метрики
**Механизм оси целиком:** `01-metrics-rest.txt` (покой) → `03-full-before-outage.txt`
отказ вызван → `04-full-during-outage.txt``06-diff-before-vs-during-outage.txt` (дифф, на котором
ось и закрывается) · `20-abandon-keeps-the-hold.sh` и `r3-abandon-hold.sh` (`PD-391`) ·
`30-stale-gauges.sh` и `r1-boot-with-blind-telemetry.sh` (`PD-390`) · `r6-read-replica-zeroes.sh`
(вторая половина `PD-390`) · `50-gauges-without-a-handle.sh` и `r5-hold-without-a-handle.sh`
(`PD-392`) · `40-exposition-check.sh` (`PD-393`) · `60-mutations.sh` (`PD-389`).
## Переносимость
Скрипты параметризованы переменными окружения (`P8_COPY`, `P8_REPO`, `P8_OUT`, `P8_ENV`, `CTL`,
`ROOT`, `PLATFORM`, `BASE`) — стендовых путей этой сессии в исполняемом коде не осталось, остались
только примеры в комментариях. `bash -n` чист на всех скриптах каталога. Файлы с расширением
`.go.txt` — готовые пины и пробы; они НАМЕРЕННО не `.go`, иначе `go vet ./...` и `gofmt -l` в зоне
падают на конфликте пакетов внутри `docs/`.