Skip to content

fix(доступ): поле под маской — заполнить пустое, набранное не превращается в звёздочки - #1923

Merged
ivanarama merged 7 commits into
ivanarama:mainfrom
AnnaSIceberg:fix/masked-empty-field-fill
Oct 8, 2026

Conversation

@AnnaSIceberg

@AnnaSIceberg AnnaSIceberg commented Oct 6, 2026 •

Copy link
Copy Markdown

Режим работы

  • Эксперимент: PR остаётся Draft, гипотеза или контракт ещё меняются
  • Поставка: результат проверен, текущий HEAD готов к конвейеру

Что было

Поле под маской (ПДн, pii: true / field_access mask_*) нельзя было заполнить в записанном объекте, а набранное в форме терялось. Реальный сценарий (колл-центр): заявку из звонка код создаёт и записывает, потом открывает оператору для оформления; телефоны у оператора под маской.

  1. Сохранение: protectMaskedFieldsOnWrite восстанавливал из базы каждое поле под маской — пустое тоже. Введённый оператором телефон молча отбрасывался (проверено на живом экземпляре: Заказчик записался, ТелефонМобильный — нет).
  2. Событие формы: ответ form-event маскировал все защищённые поля, включая номер, который пользователь только что набрал. Следующее событие («Принять заявку» → ответ на вопрос) или запись присылали на сервер уже ••••••; после правки п. 1 в пустое поле легли бы сами звёздочки (так и случилось на стенде с первой версией этого PR).

Что стало

  • access.MaskedEmptyFillable(decision, stored, submitted): пустое под mask_* (роль видит его пустым) заполнить можно; заполненное по-прежнему не меняется; hide не заполняется никогда; значение со знаком маски (access.LooksMasked) не заполняет ничего — это маска, которую показала форма. Общая точка для формы/обработчиков/DSL (ui) и REST (api).
  • submittedFieldsToEcho: ответ события отдаёт без маски ровно то, что клиент прислал в этом запросе (он это значение и так знает). Значение из базы (клиент прислал маску) и поставленное обработчиком уходят маской, как раньше.
  • Поле под полной маской (mask_all) в управляемой форме помечено data-ob-protected и показывается точками, как пароль (-webkit-text-security: disc): и маска из базы, и набираемый номер. mask_tail/mask_city показывают часть значения намеренно — без точек.
  • managed.js applyValues: ответ события не трогает поле, которое пользователь изменил, пока шёл запрос, если сервер вернул ровно отправленное — раньше набранные за это время символы стирались (на живой форме пропала последняя цифра телефона).

Пользовательский результат и границы

Роль с маской на ПДн может ввести телефон в записанный документ, видит его точками, и он не подменяется звёздочками ни в форме, ни в базе. Изменить или стереть уже сохранённое она не может. Не входит: автоформы (не managed) — пометка точками только в управляемых; код под маской по-прежнему видит ПДн маской (выгрузку ПДн во внешние системы прикладная конфигурация делает фоновым заданием).

Проверки

Через публичные маршруты (s.Mount):

  • TestUI_SaveCard_MaskedEmptyFieldCanBeFilled — POST /ui/catalog/...: пустое заполняется (mask_tail, pii/mask_all); заполненное и маска не меняют; маска в пустое не пишется; hide не заполняется.
  • TestUI_FormEvent_EchoesTypedMaskedValue — POST .../form-event: набранное возвращается как есть; поставленное обработчиком и значение из базы — маской. Мутационно: без правки «получено ••••••».
  • TestUI_ManagedForm_ProtectedInputRenderedAsPassword — GET формы: поле под маской помечено, настоящего значения в разметке нет; без маски — значение и без пометки.
  • TestManagedApplyValuesKeepsTypingInNode → static/managed_apply_typing_test.js (настоящий applyValues): набранное не стирается эхом; изменённое сервером применяется. Мутационно: без правки падает.
  • TestAPI_FieldMask_EmptyMaskedFieldCanBeFilled (REST PUT), TestMaskedEmptyFillable* (таблица стратегий, маска).
  • go test ./internal/ui ./internal/api ./internal/access, go vet — зелёные.
  • Пересечения по файлам: fix: корректный total/total_pages для report v2 #1484 (internal/access/field_access.go, отчёты v2) и feat(dsl): СериализаторXDTO — сериализация объекта в XML формата 1С и обратный разбор #1386 (internal/ui/field_access.go, XDTO) — другие задачи и функции.

🤖 Generated with Claude Code

Защита «нельзя изменить то, что не видно» при сохранении записанного объекта
восстанавливала из базы каждое поле под маской. Пустое значение роль видит
пустым — скрывать там нечего, — но и введённое ею молча отбрасывалось. Так
оператор, которому телефоны клиента показываются маской, не мог ввести
телефон в документ, созданный кодом и открытый для оформления (заявка из
звонка): форма записывалась без ошибки, номер терялся.

Теперь пустое под маской (mask_*) заполнить можно; заполненное по-прежнему
не меняется ни маской, ни подделанным значением; поле hide не заполняется
никогда — его пустоту роль не видит. Правило общее для формы, обработчиков
формы, DSL и REST (access.MaskedEmptyFillable).

Generated-with: Claude Code
@AnnaSIceberg
AnnaSIceberg marked this pull request as ready for review October 6, 2026 12:17
Продолжение предыдущего коммита — найдено на живой форме. Ответ события
управляемой формы маскировал все защищённые поля, в том числе номер, который
пользователь только что набрал: следующее событие («Принять заявку» → ответ
на вопрос) или запись присылали на сервер уже «••••••». Раньше номер так
молча терялся, а с заполнением пустого поля в базу легли бы сами звёздочки.

- значение со знаком маски никогда не заполняет поле (access.LooksMasked):
  это маска, которую показала форма, а не данные;
- ответ события возвращает без маски ровно то, что клиент прислал в этом
  запросе (он это значение и так знает); значение из базы и поставленное
  обработчиком уходят маской, как раньше;
- поле под маской в управляемой форме помечено data-ob-protected и
  показывается точками, как пароль (-webkit-text-security).

Generated-with: Claude Code
@AnnaSIceberg AnnaSIceberg changed the title fix(доступ): пустое поле под маской можно заполнить в записанном объекте fix(доступ): поле под маской — заполнить пустое, набранное не превращается в звёздочки Oct 6, 2026
@AnnaSIceberg

Copy link
Copy Markdown
Author

Новый HEAD 5a7371f5: дополнение по живой форме — набранное в поле под маской больше не возвращается звёздочками в ответе события, маска не записывается в базу, поле показывается точками. Описание обновлено. CI жду.

Anna added 2 commits October 6, 2026 15:59
…ая маска

Найдено на живой форме: в телефоне заявки пропала последняя цифра. Ответ
form-event перезаписывал все поля, в том числе то, которое пользователь
набирал, пока шёл запрос, — символы, набранные за это время, стирались (с
точками вместо цифр этого не видно). Теперь applyValues не трогает поле,
изменённое после отправки, если сервер вернул ровно отправленное значение;
изменённое сервером применяется как раньше.

Точками, как пароль, показывается только поле под mask_all: mask_tail и
mask_city намеренно показывают часть значения, точки скрывали и её.

Generated-with: Claude Code
@AnnaSIceberg

Copy link
Copy Markdown
Author

Новый HEAD a7b99ef1: ещё одна находка с живой формы — ответ form-event перезаписывал поле, которое пользователь набирал во время запроса (терялась последняя цифра телефона): applyValues теперь не трогает поле, изменённое после отправки, если сервер вернул ровно отправленное (тест static/managed_apply_typing_test.js + Go-обёртка, мутационно проверен). Точками показывается только mask_all — mask_tail/mask_city показывают часть значения намеренно.

@ivanarama

Copy link
Copy Markdown
Owner

Ревью. (круг 1)
Reviewed-SHA: a7b99ef
Outcome-Label: changes-requested
Что меняется: Пустые поля под mask_* разрешено заполнять через UI, DSL и REST; ответ события возвращает введённое клиентом значение, managed-форма скрывает mask_all точками, а applyValues сохраняет ввод, сделанный во время запроса..
Проверено: Независимое ревью Codex всех 11 файлов diff на точном HEAD a7b99ef в detached worktree; git diff --check — успешно.; Обязательный CI того же HEAD: build, lint, postgres-integration, vuln, smoke, e2e, test-windows, launcher-webview-build — SUCCESS.; go build ./... — успешно.; go test -count=1 ./internal/access ./internal/api ./internal/ui — успешно.; go vet ./internal/access ./internal/api ./internal/ui — успешно.; go run ./cmd/onebase check --project examples/trade — OK: ошибок не найдено.; Node v22.21.0: managed_apply_typing_test.js, managed_close_intent_behavior_test.js, managed_ref_value_behavior_test.js, managed_ro_mirror_behavior_test.js, choice_filter_refresh_behavior_test.js, managed_file_reader_behavior_test.js, managed_form_attrs_behavior_test.js и picker_server_search_behavior_test.js — 123 теста успешно, без пропусков.; Дополнительная проверка через s.Mount и POST /ui/catalog/Клиент/form-event с обработчиком Объект.Записать() — успешно воспроизведён реальный ответ: persisted="(937)637-32-7", echoed="(937)637-32-7", dirty=false, version=2. Диагностический Go-тест подключён через -overlay, код PR не изменён.; Дополнительный Node-тест вызывает настоящий window.obFire, dispatchFormEvent, applyValues и контроллер закрытия: поздний ввод остаётся "(937)637-32-71", dirtyAfterEvent=false, closeModes=["discard"], allowed=true. Проверка сохранения dirty-флага падает; причина связана с описанным блокирующим дефектом. Штатный тест PR проверяет только applyValues и этого взаимодействия не покрывает..
Блокирующее: 1) [P1] Не сбрасывать dirty-флаг для позднего ввода, сохранённого на экране. В internal/ui/static/managed.js:382 и :1125 новый applyValues(..., snapshot.body) оставляет более свежий ввод, но :1131 безусловно вызывает setManagedFormDirty(false) после ответа с dirty=false и version/savedId. Воспроизведение: отправить телефон "(937)637-32-7" в событие, обработчик которого вызывает Объект.Записать(); пока идёт запрос, допечатать "1"; сервер записывает старое значение и возвращает его с dirty=false, version=2. На экране остаётся полный телефон "(937)637-32-71", но _obFormDirty=false; обычное закрытие выбирает discard без вопроса и теряет последнюю цифру. Это подтверждено отдельно через публичный HTTP-маршрут и через window.obFire → закрытие с настоящим applyValues. При сохранённых поздних правках dirty должен оставаться true; учесть snapshot.editRevision либо факт сохранения более свежих значений и добавить тест всего сценария сохранения события и последующего закрытия..
Хвост:
—
Вердикт: есть замечания.

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result publication claimed.

@ivanarama ivanarama added the changes-requested Ревью: есть замечания — фиксер дорабатывает label Oct 7, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result committed.

Generated-with: Codex
PP-Fix-Transition: from=a7b99ef1a462b9aa1b2eb395527660525dfe192e review-comment=6045729526 claim=6045730290 epoch-sha256=03fa7e23300be484c37ace6d55cbdaa15407a51add73e904c5b4b2b04f8881ff
@ivanarama

Copy link
Copy Markdown
Owner

Доработан блокирующий пункт 1 завершённого ревью 6045729526.

Ответ события, записавшего объект, теперь сбрасывает dirty-флаг только при неизменном editRevision отправленного снимка. Если пользователь допечатал телефон во время запроса, сохранённое на экране значение остаётся несохранённой правкой: закрытие формы требует подтверждения. При отсутствии позднего ввода успешная запись по-прежнему очищает dirty-флаг.

Добавлена регрессия полного сценария: публичный POST /ui/catalog/Клиент/form-event с Объект.Записать() действительно сохраняет отправленный номер и отдаёт dirty=false/version; этот HTTP-ответ передаётся клиентскому тесту window.obFire с настоящими applyValues и обработчиками input. Проверены поздний ввод на чистой и уже изменённой форме, подтверждение закрытия и передача полного номера в save-запрос. Контроль без позднего ввода закрывается без лишнего вопроса. На исходном коде оба сценария позднего ввода падали из-за сброса dirty-флага; после правки проходят.

Проверено: go build ./...; go test -count=1 -timeout=10m ./internal/ui; go vet ./internal/ui; onebase check --project examples/trade; git diff --check. Все проверки прошли. С Node 22.21.0 восемь клиентских наборов дали 127 успешных тестов без пропусков, включая сохранение события, закрытие, ввод, ссылки, зеркала, реквизиты, чтение файлов и подбор. PostgreSQL для локального прогона не задавался; семантика SQL не менялась.

Доработка ограничена блокером ревью; раздел «Хвост» пуст. Новый HEAD 63285e5 опубликован CAS-push с ожидаемым исходным SHA. Удалённая ветка, HEAD PR, единственный родитель и PP-Fix-Transition подтверждены через REST. Обязательный GitHub CI нового SHA запущен и выполняется; успех ещё не подтверждён. Следующий шаг — независимое REVIEW нового HEAD.

Generated-with: Codex

@ivanarama ivanarama removed the changes-requested Ревью: есть замечания — фиксер дорабатывает label Oct 8, 2026
@ivanarama

Copy link
Copy Markdown
Owner

Ревью. (круг 2)
Reviewed-SHA: 63285e5
Outcome-Label: changes-requested
Что меняется: Заполнение сохранённых пустых полей под mask_, исключение строк-масок из записи, эхо собственных значений в form-event, визуальная защита mask_all и сохранение позднего ввода/dirty-флага в managed.js. Проверен HEAD 63285e5..
Проверено: Точный HEAD 63285e5 проверен в detached worktree; полный diff относительно base 66a9a10 прочитан; git diff --check прошёл.; go build ./... — прошёл.; go test -count=1 ./internal/access ./internal/api ./internal/ui — прошёл (включая Node-проверки applyValues, close-intent и фактический ответ сохранённого события формы). Эти пакеты покрывают изменённый access-хелпер и его UI/REST/DSL-потребителей; полный набор ./... не запускался.; go vet ./internal/access ./internal/api ./internal/ui — прошёл.; go run ./cmd/onebase check --project examples/trade — OK: ошибок не найдено.; Дополнительная проверка через s.Mount: TestReview1923HiddenFormEventOmitted/noop_arbitrary_submission и /noop_matching_submission. POST /ui/catalog/Клиент/form-event, роль read/write с Телефон.read=hide, непустой Телефон в запросе и пустой обработчик. На HEAD оба случая падают: values содержит Телефон; тот же overlay и те же случаи на неизменённом base проходят. Диагностические тесты находятся вне рабочей копии и подключены через go test -overlay.; Обязательный CI точного HEAD: build, lint, postgres-integration, vuln, smoke, e2e и launcher-webview-build — SUCCESS; test-windows — FAILURE. В журнале job 113354528991 упал TestNavigationEditorTitlesIDProductionRoundTrip/database/global/item-item (internal/launcher), HTTP round trip subprocess: exit status 1. Этот сбой не объявляется шумом окружения; зелёный обязательный CI отсутствует. bench — SUCCESS..
Блокирующее: 1) [P2] internal/ui/handlers_managed_events.go:2916: submittedFieldsToEcho проверяет только decision.Masked(), но этот метод возвращает true и для hide. Поэтому serializeManagedFormEventState сначала удаляет скрытое поле через maskRecord, затем возвращает его из echo. Воспроизводится через публичный POST /ui/catalog/Клиент/form-event с политикой Телефон.read=hide и no-op обработчиком: присланный Телефон появляется в values, хотя hide требует отсутствия ключа в выдаче. На base тот же сценарий не возвращает поле. Исключить Hidden() из эха (либо ограничить эхо стратегиями mask_
) и добавить HTTP-регрессию для hide; заполнение/эхо разрешённых mask_* сохранить..
Хвост:

  1. [выброс] Отдельная предсуществующая находка подтверждена на неизменённом base и сохранена в локальной приватной заметке для владельца. В публичную очередь TAIL её не переносить: CONTRIBUTING.md требует приватного маршрута для возможных уязвимостей; эта находка не является новым блокером данного diff.
    Вердикт: есть замечания.

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result publication claimed.

@ivanarama ivanarama added the changes-requested Ревью: есть замечания — фиксер дорабатывает label Oct 8, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result committed.

Политика hide сохраняет отсутствие поля в ответе даже для значения,
присланного клиентом. HTTP-регрессия проверяет hide на заполненном
и пустом поле и сохраняет эхо для mask_all, mask_tail и mask_city.

Generated-with: Codex
PP-Fix-Transition: from=63285e522a5f1b2747e38f4ced1f524bc8fc2386 review-comment=6062113653 claim=6062114622 epoch-sha256=61530e97c3e8dee8bdbfb21ebef490dc7d6db4a9a4ccdf65fc6fb20381bd5486
@ivanarama

Copy link
Copy Markdown
Owner

Доработан блокирующий пункт 1 завершённого ревью 6062113653.

Поле с политикой hide теперь исключено из эха присланных значений: ответ события не восстанавливает ключ после применения маскирования. Эхо разрешённых mask_all, mask_tail и mask_city сохраняется.

Добавлена HTTP-регрессия через s.Mount и POST /ui/catalog/Клиент/form-event с настоящей политикой доступа и пустым обработчиком. Проверены произвольное значение скрытого поля, совпадение с базой и пустое поле в базе; во всех случаях ключ отсутствует в values. На исходном HEAD эти три сценария падали, после исправления проходят. В том же тесте проверено сохранение эха трёх mask_*; существующие проверки заполнения, эха и позднего ввода также прошли.

Проверено: go build ./...; go test -count=1 -timeout=10m ./internal/ui с Node 22.21.0 в PATH; go vet ./internal/ui; go run ./cmd/onebase check --project examples/trade; git diff --check. Все проверки успешны. Семантика SQL не менялась; PostgreSQL локально не запускался.

Правка ограничена блокером этого ревью; неблокирующий «Хвост» оставлен вне доработки по процедуре. Новый HEAD 983c92b отправлен отдельным обычным коммитом через CAS-push с ожидаемым исходным SHA; ветка fork, HEAD PR, родитель и PP-Fix-Transition подтверждены через REST. Локальные проверки не заменяют обязательный CI нового точного HEAD. Далее нужны независимое REVIEW и все восемь обязательных CI-проверок.

Generated-with: Codex

@ivanarama ivanarama removed the changes-requested Ревью: есть замечания — фиксер дорабатывает label Oct 8, 2026
@ivanarama

Copy link
Copy Markdown
Owner

Ревью. (круг 3)
Reviewed-SHA: 983c92b
Outcome-Label: reviewed
Что меняется: Роль с mask_* может заполнить сохранённое пустое поле через UI/DSL и REST; заполненное поле и строка-маска защищены от перезаписи. Событие формы возвращает собственный введённый телефон, однострочное поле mask_all показывает его точками, а поздний ввод сохраняется вместе с dirty-флагом.
Проверено:

  • Полный diff всех 12 файлов на точном HEAD в detached worktree; git diff --check — успешно. Две прежние завершённые пары review/claim/completion проверены по REST и двум полным совпавшим проходам GraphQL; текущая server epoch чистая.
  • go build ./... — успешно.
  • go test -count=1 -timeout=10m -v ./internal/access ./internal/api ./internal/ui — успешно. Эти пакеты покрывают изменённый access-хелпер и его UI/REST/DSL-потребителей; полный набор ./... не запускался.
  • go vet ./internal/access ./internal/api ./internal/ui — успешно.
  • go run ./cmd/onebase check --project examples/trade — OK: ошибок не найдено.
  • Регрессии заполнения пустого поля, сохранения заполненного значения, отказа от записи маски и эха введённого значения прошли. Через s.Mount проверено отсутствие ключа hide в form-event при произвольном, совпадающем с базой и пустом сохранённом значении; эхо mask_all/mask_tail/mask_city сохранено.
  • С Node v22.21.0 выполнены клиентские регрессии applyValues и закрытия формы. Тест передаёт реальный HTTP-ответ события с Объект.Записать() в настоящий клиентский контроллер: поздняя цифра остаётся на экране, dirty=true требует подтверждения закрытия, save отправляет полный номер. Без позднего ввода dirty корректно сбрасывается. Проверки ссылок, зеркал, реквизитов, чтения файлов, фильтров и подбора также прошли в целевом Go-наборе.
  • PostgreSQL и браузерный layout локально не запускались: соответствующие проверки пропущены по условиям окружения. Семантика SQL в diff не меняется.
  • Обязательный CI точного HEAD: build, lint, postgres-integration, vuln, smoke, e2e, test-windows, launcher-webview-build — SUCCESS.
    Блокирующее: нет. Оба блокера предыдущих кругов — потеря dirty-флага после позднего ввода и возврат hide-поля из эха — устранены; исправления проверены по коду и регрессиям.
    Хвост:
    —
    Вердикт: годится к мержу. Это содержательный аудит данного HEAD; перед merge остаются обязательные проверки синхронизации с актуальным main.
    Generated-with: Codex

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result publication claimed.

@ivanarama ivanarama added the reviewed Ревью: блокирующего нет — ждёт ship label Oct 8, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result committed.

@ivanarama ivanarama added the ship Иван одобрил мерж: пастух может вливать label Oct 8, 2026
@ivanarama

Copy link
Copy Markdown
Owner

Автоматическое обновление PR #1923 актуальным main; разрешение ship сохранено для последующего интеграционного REVIEW.

@ivanarama

Copy link
Copy Markdown
Owner

PR #1923 обновлён актуальным main. Переход HEAD и сохранение ship подтверждены; требуется интеграционное REVIEW нового HEAD.

@ivanarama

Copy link
Copy Markdown
Owner

Ревью. (круг 4)
Reviewed-SHA: c36bd45
Outcome-Label: reviewed
Что меняется: Интеграционный переход 983c92b → c36bd45 подмешивает main 788ed47. Исходное содержимое подтверждено завершённым ревью 6062868228 / claim 6062871597 / completion 6062877615. Проверены совместимость изменений маскирования и позднего ввода с обновлёнными managed-формами, состояниями элементов и протоколом закрытия.
Проверено:

  • Точные родители merge-коммита [983c92b, 788ed47]. Полный граф PR сохраняет шесть исходных коммитов и добавляет ровно один новый merge-коммит; подмешанный base является предком наблюдавшегося main.
  • Неизменяемая цепочка source proof → intent 6063334594 → done 6063364440 и последний доверенный ship-event доказаны REST и двумя полными совпавшими проходами GraphQL. Node id/fullDatabaseId, edge cursors, чистая текущая epoch и отсутствие edit/delete/override/lifecycle-разрыва подтверждены.
  • Дельта from → to: 51 файл. Прочитаны изменения исполняемого кода и связанной документации, проверены пересечения четырёх UI-файлов. Повторное слияние исходного HEAD с фактическим base в отдельном detached worktree прошло без конфликтов; дерево 44c1c9e253d840f6ad2ea491a680c432998ecb99 точно совпало с деревом проверяемого HEAD. git diff --check — успешно.
  • go build ./... и go vet ./... — успешно.
  • go test -count=1 -timeout=10m -json ./...: 93 пакета прошли, 9 без тестов, один пакет internal/cli завершился ошибкой. Триггер полного набора — сквозное обновление go.mod/go.sum: golang.org/x/text v0.40.0 → v0.41.0, сопровождаемые x/mod и x/tools.
  • Все три ошибки полного набора — TestRunServiceInstallPrintCarriesExplicitHost, TestRunServiceInstallPrintDefaultsToLoopback и TestRunServiceInstallPrintInheritsRegistryHost. Отдельный go test -count=1 -timeout=2m ./internal/cli -run '^TestRunServiceInstallPrint(CarriesExplicitHost|DefaultsToLoopback|InheritsRegistryHost)$' воспроизвёл их на точном HEAD и неизменённом base 788ed47 в той же среде. Сообщение одинаково: «автоустановка сервиса не поддерживается на darwin; используйте --print для получения конфигурации». service.go и service_test.go побайтово одинаковы на base и HEAD; падения классифицированы как предсуществующая платформенная проблема, не регрессия этой дельты. Полный набор повторно не запускался.
  • В полном наборе прошли публичные HTTP-регрессии заполнения пустого поля, эха mask_*, отсутствия hide-поля и защиты mask_all; с Node v22.21.0 прошли настоящий applyValues и сценарий form-event → поздний ввод → dirty=true → подтверждение закрытия/сохранение полного значения.
  • go run ./cmd/onebase check --project examples/trade — OK: ошибок не найдено. PostgreSQL и браузерная геометрия локально пропущены штатными условиями окружения; они не объявляются локально проверенными.
  • Обязательный CI точного HEAD: build, lint, postgres-integration, vuln, smoke, e2e, test-windows, launcher-webview-build — SUCCESS.
    Блокирующее: нет. Разрывов carry, дополнительных изменений собственного кода и новых дефектов совместимости не обнаружено.
    Хвост:
  1. [выброс] Три платформенных падения service --print на macOS зафиксированы как ограничение локального полного прогона с положительным контролем на неизменённом base. Они не относятся к проверяемому интеграционному переходу; отдельный хвост из этого PR по ним не создаётся.
    Вердикт: интеграционная дельта годится к мержу. Существующее разрешение ship сохраняется; дальнейший ход принадлежит MERGE.
    Generated-with: Codex

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result publication claimed.

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: REVIEW result committed.

@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: MERGE transaction reserved.

@ivanarama
ivanarama merged commit 94040a7 into ivanarama:main Oct 8, 2026
13 checks passed
@ivanarama ivanarama removed the ship Иван одобрил мерж: пастух может вливать label Oct 8, 2026
@ivanarama

Copy link
Copy Markdown
Owner

PromptPilot service marker: MERGE cleanup completed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

reviewed Ревью: блокирующего нет — ждёт ship

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants