Перейти к основному содержимому

Реестр BRB

Находки BRB-NNN выявляются и приоритизируются в vault мейнтейнера (07-backlog/Backlog de Melhorias (Brabo)), где хранятся все 33 с приоритетом, трудоёмкостью, происхождением, предложением и условием «готово, когда». Тот реестр — источник того, что такое находка и закрыта ли она.

Этот файл — та часть, которую репозиторий может проверить. Создан в FASE 29, сессия 1 (fase-29-instalacao-de-uma-linha.md).

Критерий покрытия​

У каждого id от BRB-001 до BRB-033 ровно одна строка, в числовом порядке. До 2026-09-27 страница перечисляла только находки, которые код мог доказать или опровергнуть, — 11 из 33, — а остальные были здесь невидимы, в том числе шесть, которые vault уже измерил как исправленные (AT-186). Строка на каждый id ничего не стоит и делает отсутствие доказательства видимым, а не молчаливым. Каждая строка содержит:

  • состояние в vault — скопировано из реестра vault на 2026-09-27. Это решение мейнтейнера, и здесь оно никогда не принимается.
  • измерено здесь — что показывает репозиторий, измерено против dev на 34c1c83bdc 2026-09-27, если доказательство не датировано иначе.
  • доказательство — файл:строка, PR или запуск, стоящие за этим измерением.

Находка, предмет которой живёт вне этого репозитория (собственные заметки vault, продуктовое решение, платная учётная запись), всё равно получает строку, помеченную здесь не проверяемо, с причиной. Id без какой-либо информации получил бы TODO(humano) — сегодня такого нет. Новый BRB-NNN в vault получает свою строку здесь в том же изменении, которое упоминает его впервые.

Зачем существует этот файл​

BRB-018 — это второе правило ниже на практике. Когда этот файл появился, в коде по нему ничего не изменилось — никакой репроекции написано не было, — но репозиторий получил способность сказать, почему находка остаётся открытой и во что обходится, пока остаётся, поэтому строка появилась раньше исправления. Команда теперь существует (RN-569); строка остаётся, потому что доказательства в кластере нет.

Два id — BRB-005 и BRB-031 — упоминались в пяти документах здесь, в прозе, без состояния, которое кто-либо мог бы проверить. Остальные id были полностью невидимы для этого репозитория: поиск по всему диску вернул только эти два.

Цена была измерена, а не придумана. Планирование FASE 29 перечислило шесть пунктов BRB как предпосылки или риски; сверка каждого с dev показала, что два описывают дефекты, здесь уже исправленные, а третий был неверно прочитан только по id — см. BRB-004 ниже, который не о том теге, о котором все думают.

Отсюда два правила:

  • Состояние держится на файл:строка, измеренном, никогда — на памяти.
  • Vault владеет находкой; репозиторий владеет доказательством. Где они расходятся в том, происходит ли что-то до сих пор, побеждает репозиторий — он и есть описываемая вещь. Закрыт ли пункт формально — по-прежнему решение мейнтейнера, в vault.

Реестр​

idзаголовок (из vault)приор.состояние в vaultизмерено здесьдоказательство
BRB-001Потолок для самопонижения через УДАЛЕНИЕ членства в проектеP1закрыто 2026-09-12 (PR #531)дефект больше не воспроизводитсяRemoveProjectMemberUseCase.execute получал (projectId, userId) — без актора, — а controller вызывал его с двумя параметрами маршрута, поэтому maintainer, чьи полномочия шли от строки проекта (viewer в workspace), мог удалить собственную строку и необратимо упасть до viewer; случай был зафиксирован в тесте, само имя которого говорило, что он открыт. ADR 0127 объявил пробел письменно, с оценкой стоимости. Закрыто ADR 0156 / RN-556: актор теперь доходит до сценария, remocaoEhAutoRebaixamento делегирует существующему правилу потолка 2 с ролью workspace в качестве запрошенной, а тест пробела был ИНВЕРТИРОВАН, а не удалён. Потолок для owner workspace намеренно не получает пары — удаление может только повысить owner
BRB-002Потолок для самоизменения в upsert участника WORKSPACEP2закрыто 2026-09-12 (PR #533)дефект больше не воспроизводитсяAddWorkspaceMemberUseCase.execute получал (workspaceId, userId, role) и вызывал workspaces.addMember — без актора, — а controller (@Post(':workspaceId/members'), @RequireRole('owner')) передавал сырое тело без @CurrentUser(). owner мог записать себя viewer и потерять весь workspace: выше ничто не удерживает падение, а у WorkspacesController нет @Delete участника (измерено), так что отменить можно только этим же маршрутом, который требует только что оставленного owner. ADR 0127 назвал его письменно («mesma classe de defeito, um escopo acima»), а ADR 0156 оставил его отдельным решением. Закрыто ADR 0157 / RN-557: актор доходит до сценария, и изменение собственной роли — 403 в обоих направлениях. Потолок не считает owners (условие уже гарантирует, что у workspace их никогда не станет ноль, ведь удаление последнего owner потребовало бы самого этого owner), и потолок 1 здесь пары не получает — @RequireRole('owner') уже запрещает инверсию иерархии, ради которой он существует, а его добавление сделало бы owner поглощающим состоянием без выхода по HTTP. Тот же ADR закрывает самоповышение в обоих маршрутах членства, пересматривая Последствия ADR 0127: это единственная половина движения, которая повышает привилегии
BRB-003Исправить три описания OpenAPI, обещающих «o maior dos dois» (RN-471)P2закрыто 2026-09-27 (AT-136)дефект больше не воспроизводитсяgrep -rn "higher of the two" apps/api/src возвращает пусто. apps/api/src/interfaces/http/iam/dto/add-member.dto.ts:29 и projects.controller.ts:190,239 говорят, что роль проекта ПЕРЕКРЫВАЕТ роль workspace в обоих направлениях — текст пришёл с ADR 0127 / RN-472 (PR #445). Впервые измерено 2026-09-11 (AT-017)
BRB-004Закрепить сторонние образы (neo4j, pgvector, ollama) по digestP2открытодефект больше не воспроизводитсяБыло: каждый сторонний образ закреплён по тегу, а не по digest. Закрепление по тегу закрыло другой пробел (PR #401/#419), и эта строка читалась так, будто то было исправлением, — причина, по которой различие между id и описанием, ниже, стоит своей цены. Закрыто ADR 0159: 37 ссылок на сторонние образы идут по digest индекса с тегом в комментарии в конце, а scripts/ci/imagens-pinadas.ts проваливает job lint на изменяемой ссылке, на digest без комментария с тегом и на одном теге с двумя разными digest. Счёт — 37, а не список самой находки, потому что три места целиком были вне его: строки FROM в Dockerfile (база четырёх образов, которые мы публикуем и подписываем) и образы services: в ci.yml/golden-set-rag.yml — runner CI, который уже защищает родственное правило, достигнутый через другую дверь. Пять образов, которые публикует продукт, намеренно не покрыты (четыре, когда строка была написана; пятый, broker, пришёл с ADR 0162): никакая третья сторона не может их сдвинуть, brabo-api:prod — локальный тег, чей digest не существует до сборки, а там, где они пересекают registry, их уже разрешает ADR 0119 — overlay намеренно хранит маркер, так что литерал там провалил бы правильное состояние. Объявлено и не исправлено, потому что это цена закрепления: digest не получает обновлений безопасности, пока кто-то не поднимет его вручную, а экосистема docker в Dependabot остаётся выключенной — отдельное решение. Также обнаружено и сказано: otel-collector-values.yaml, где image: открывает словарь, тег в котором выбирает chart Helm
BRB-005Подписывать образы GHCR и бинарники runnerP2открытореализовано, ещё не испытаноБыло: ни одного cosign/sigstore/attestation нигде, release.yml без id-token: write, никакого checksums.txt. Теперь: release.yml подписывает пять образов по digest (четыре, когда это было написано; ADR 0162 добавил broker) и проверяет их в том же запуске; build-runner-binaries.yml получил job checksums, публикующий один подписанный манифест для пяти целей (ADR 0149, RN-524); процедура проверки — в runbook. Не испытано: подпись выполняется только на настоящем финальном теге, поэтому ничто здесь пока не доказывает её от начала до конца. Всё ещё не покрыто, и это отдельный пункт: подпись кода ОС для бинарников (нотаризация/Authenticode). Сессия 3 заставила прокси загрузки GET /runner-releases/binary проверять — но только sha256 против checksums.txt релиза, никогда подпись манифеста (RN-525): это целостность, а не происхождение, и тот, кто может переписать Release, переписывает оба файла. Оба способа, которыми api могла бы проверять подпись, были измерены и отвергнуты: cosign в образе — это 155 MB (почти вдвое увеличивая runtime-образ Alpine+Node), а @sigstore/verify+@sigstore/tuf дёшев (2,5 MB), но делает маршрут @Public() зависимым от второго стороннего хоста (tuf-repo-cdn.sigstore.dev) ради проверки того, чего пока не несёт ни одна Release, — маловероятно, а ADR 0041/0042 запрещают объявлять недоказанную возможность. Потребитель подписи — install.sh (сессия 4/7), у которого есть настоящий закреплённый cosign. Поэтому половина прокси про происхождение остаётся открытой, и у отказа там уже есть имя: Release без checksums.txt отклоняется, а не отдаётся с предупреждением
BRB-006Автоматизировать обновление закреплённых SHA (Dependabot/Renovate)P3открытодефект больше не воспроизводится.github/dependabot.yml:35 объявляет экосистему github-actions (и npm, :55/:61), все с target-branch: dev; .github/workflows/dependabot-para-dev.yml направляет обновления безопасности в dev, а scripts/ci/dependabot-justifica-pin.ts (AT-094) пишет строку docs-not-needed: в bump, меняющий только pin. Здесь не измерено: «готово, когда» требует настоящего PR с bump, проходящего actions-pinadas.ts без ручного шага, — для этой строки ни один PR не указан
BRB-007Запускать golden-set Automation-QA в CIP2поставлено 2026-09-27 (PR #687, #689), не отмечено как закрытоедефект больше не воспроизводится.github/workflows/golden-set-qa.yml:39 запускает его еженедельно (cron: '17 1 * * 6') плюс workflow_dispatch, никогда в pull_request (ADR 0168). Инструмент снова измеряет под RN-502: seed поднимает контейнер через container_start (AT-076), и доказательные запуски показали 3/6 против нижней границы 1/6. Нижняя граница в apps/engine/test/fixtures/golden_set_qa/floor.json всё ещё от 2026-08-30 — пишет её только человек
BRB-008Заменить (или обосновать) модель по умолчанию в seed golden-setP2открытовсё ещё воспроизводитсяapps/api/scripts/seed-golden-set-qa.ts:119 по умолчанию всё ещё использует qwen2.5-coder:latest, чья нижняя граница в apps/engine/test/fixtures/golden_set_qa/floor.json — 1/6 (против 4/6 у gpt-oss:20b). Никакое решение не записано
BRB-009Запланировать три доказательства свойств (test-restore, rollout-test, hpa-test)P2открытооткрыто — теперь по расписанию; мутация restore ловится, последний успешный запуск — артефакт workflow, но ещё не метрикаБыло: три цели (Makefile:41-48) запускались, только когда кто-то набирал make, и ни один workflow не поднимал кластер (grep -rn "k3d|kind" .github/workflows/ возвращал пусто). Теперь .github/workflows/propriedades.yml запускается еженедельно и по workflow_dispatch: устанавливает k3d/helm/kubectl по закреплённой контрольной сумме, запускает тот же deploy/k8s/bootstrap.sh, что и человек, затем make smoke-k8s, make hpa-test, make rollout-test и make test-restore, каждый с замером времени в сводке запуска; упавшая цель открывает issue со своим именем, а повторный провал комментирует в открытой, а не открывает другую. Это не gate и не обязательная проверка. Первый запуск уже окупился: bootstrap умер при создании кластера CNPG, потому что imageName только с digest, который написал ADR 0159, отклоняется webhook оператора — kubeconform webhook не запускает, поэтому job манифестов остался зелёным. Пришли ещё девять, все исправлены в том же изменении (перечислены в runbook), один из них — вне локального кластера: brabo-restore умирал на COMMENT ON EXTENSION vector в любом Postgres, где роль приложения не суперпользователь. Первый полностью зелёный запуск — 34784563928 (2026-09-13, 12 мин 56 с), снова зелёный со второй попытки. Доказательство rollout обнаружило осиротевшую сессию в одном из четырёх дошедших до него запусков, и это объявлено, не исправлено. AT-126 закрыла первое из двух оставшихся условий: make test-restore-mutacao намеренно ломает restore (таблица в источнике, которой нет в dump), и запуск по расписанию падает и открывает собственный issue, если restore не отклонит её, назвав эту таблицу; запуск, в котором restore был намеренно ослеплён, упал на этом шаге. Всё ещё открыто, и закрыть это через CI этому репозиторию не по силам: последний успешный запуск теперь датирован workflow (артефакт restore-ultima-execucao-boa, записываемый только когда прошли restore и намеренная поломка), но не является метрикой рядом с алертами бэкапа и не строкой backupRuns — для этого нужен код в apps/api. Измеренные длительности и периодичность: runbook, Provas de propriedade agendadas
BRB-010Отработать ротацию CREDENTIALS_MASTER_KEY со скриптом и тестомP2закрыто 2026-09-27 (AT-136)дефект больше не воспроизводитсяЗакрыто PR #551, ADR 0158 / RN-562: apps/api/src/scripts/rewrap-deks.ts экспортирует ядро (reenvelopar), а apps/api/test/scripts/rewrap-deks.spec.ts — именованная проверка против настоящего Postgres и обеих таблиц конвертов; runbook запускает его (docs/runbook.md:2770). Имя команды отличается от предложенного в находке (credenciais:reenvelopar); «готово, когда» — именованная проверка — выполнено. С AT-146 у ротации есть и репетиция в кластере: она никогда не выполнялась в реальной среде (мейнтейнер, 2026-09-27), а make test-rotacao-chave-mestra-k8s еженедельно прогоняет три шага runbook в propriedades.yml — с ExternalSecret, перезапуском api и rewrap-deks.js из образа (первый зелёный запуск 36502355798)
BRB-011Закрыть единую точку отказа алертов (Grafana без Alertmanager)P2открытовсё ещё воспроизводитсяdeploy/k8s/observability/alerts/brabo-alerts.yaml:8 всё ещё говорит, что нет ни Alertmanager, ни receiver; ничто в deploy/k8s не предупреждает, когда сама Grafana перестаёт вычислять (измерено AT-121, 2026-09-19)
BRB-012Проверить никогда не испытанных LLM-providers с настоящими учётными даннымиP3открытоздесь не проверяемоЗапуск требует платных ключей, которых у этого репозитория нет. Что записывает репозиторий: таблица чата в docs/explanation/aceite-providers.md:108-115 (состояние на 2026-08-07) содержит реально запущенный OpenRouter и Together, DeepInfra, NVIDIA NIM, Bitdeer и Vultr со статусом skipped из-за отсутствия *_TEST_KEY; таблица embeddings над ней (:83-93) доказывает только Ollama
BRB-013Убрать остатки ступени rc (enum и список защищённых веток)P3открытовоспроизводится частично — половина репозитория является решениемapps/api/src/domain/actions/protected-branches.ts:12 сохраняет rc, а apps/api/src/db/schema/git.ts:24 сохраняет create_rc_branch — намеренно: список решает, что отклоняет потолок merge, а в репозиториях, развёрнутых старыми версиями, ветка ещё есть (CLAUDE.md, Convenções). Вторая половина — две заметки vault, всё ещё перечисляющие rc как защищённую, — живёт в vault
BRB-014Перевести остаток api-types.ts на сгенерированные типыP3открытовсё ещё воспроизводитсяapps/web/src/lib/api-types.ts содержит 1.852 строки и 185 export (находка говорила ~1.600), рядом со сгенерированным api-types.generated.ts
BRB-015Продолжать декомпозицию SessionPage.tsxP3открытодефект больше не воспроизводитсяapps/web/src/routes/SessionPage.tsx содержит 834 строки (было 2.637 в dev на 018b8cd24c; находка говорила 2.479, в pages/), после десяти механических PR из ADR 0176 (AT-138). «Готово, когда» — меньше 1.000, и теперь это заблокировано: apps/web/src/routes/SessionPage.teto.test.ts проваливает файл с 1.000 строк и более, доказано мутацией. Поднять потолок можно только новым ADR
BRB-016Записывать id ключа в wrapped_dek, чтобы упростить ротациюP3закрыто 2026-09-27 (AT-136)дефект больше не воспроизводитсяЗакрыто PR #551, ADR 0158 / RN-563: key_id (отпечаток мастер-ключа) в apps/api/src/db/schema/llm.ts:275 и git.ts:76, так что «сколько учётных данных ещё на предыдущем ключе?» — это запрос (IS DISTINCT FROM, считая строки без метки ожидающими). Метка никогда не решает, открывается ли конверт, — решает GCM
BRB-017Выполнить обязательство GPL для инструментов, встроенных в опубликованный образ engineP1открытодефект больше не воспроизводитсяБыло: ничто в docker/engine/ не упоминало лицензий — обязательство, ставшее реальным, когда ADR 0119 начал публиковать в GHCR на каждом финальном теге. Предложение существовало и было хорошим — THIRD_PARTY_NOTICES.md в корне, называющий каждый компонент, точную версию и лицензию, — просто оно не путешествовало. Теперь путешествует: docker/engine/Dockerfile.prod:190-192 копирует его в /usr/share/doc/brabo/ до USER и от root, так что он едет внутри каждого опубликованного образа engine (PR #532). Перемерено 2026-10-01 (AT-120): по решению мейнтейнера тот же COPY в той же форме есть в четырёх других production-Dockerfile (api, web, broker, backup), а Release runner несёт файл как asset внутри подписанного checksums.txt — ни один артефакт не объявлен исключением. Заблокировано scripts/ci/oferta-de-fonte-na-imagem.spec.ts (финальная стадия каждого Dockerfile, asset Release, случаи мутации), а job образов в ci.yml читает файл обратно изнутри каждого из пяти собираемых образов. Найдено по пути: копия в engine была нечитаема для не-root пользователя образа (BuildKit применил --chmod=0644 к созданному им каталогу), поэтому документированная проверка docker run … cat падала с «Permission denied»; теперь каталог заранее создаётся 0755. Две вещи остаются открытыми, и ни одна не дефект: sidecar (путь 3) — всё ещё не сделанный архитектурный выбор, а выполнено ли обязательство — юридическое суждение, которое этот репозиторий утверждать не может: он может лишь сказать, что образ несёт предложение. Найдено по пути: документ утверждал противоположное тому, что делает репозиторий («nenhuma imagem é publicada hoje», устарело с ADR 0119), а его TODO(humano) о решении «antes do primeiro push» истёк непрочитанным
BRB-018Написать и протестировать восстановление проекции Neo4j из event logP2открытореализовано и доказано в локальном кластере (по расписанию); без замера времени на большом логеБыло: ни одной команды репроекции нигде (grep reprojet/reproject/graph:repro в apps/ и scripts/ ничего не возвращал), при том что решение 4 ADR 0152 уже отклонило бэкап neo4j_data с аргументом, что ответ — репроекция. Теперь: apps/api/src/scripts/reprojetar-grafo.ts (pnpm --filter api grafo:reprojetar, node scripts/reprojetar-grafo.js в образе) проходит session_events и закрытые sessions курсором, пачками, и передаёт каждый источник в GraphEventTranslator — тот же перевод, который теперь вызывает прямой GraphProjector, извлечённый из него, а не написанный дважды (RN-569). Идемпотентно (MERGE, никогда не удаляет), весь лог или --project, не трогает outbox, где живой проектор хранит прогресс, и падает с именем, когда Neo4j недоступен или проекта нет. Процедура — в runbook (Perda do grafo). Доказательство — make test-reprojecao (apps/api/test/scripts/reprojetar-grafo.spec.ts): проецирует сценарий вперёд, удаляет его подграф, репроецирует, сравнивает число узлов и рёбер и список ключей, репроецирует снова — зелёное против Neo4j из dev-compose и пропускается, где Neo4j нет, включая job api в CI. Доказательство в кластере (AT-127): make test-reprojecao-k8s (deploy/k8s/test-reprojecao.sh) — четвёртая цель propriedades.yml: в созданном им проекте (одна закрытая сессия, два события) запускает node scripts/reprojetar-grafo.js --project внутри pod api, удаляет этот подграф в Neo4j кластера, репроецирует и требует тех же чисел (5 узлов, 4 ребра), затем репроецирует снова; зелёное в запуске 35471428634 за 16 с, после двух запусков, упавших в самом скрипте (35469877869, 35470685598). С AT-191 в сценарии четыре события — гипотеза Психолога и профиль Анамнеза помимо сообщения и handoff, — так что он проходит каждый путь транслятора, и числа — 9 узлов и 6 рёбер (запуск 36498776825, 18 с). Не зависит от test-restore и от состояния других целей. Ещё не закрыто: нет замера времени на большом event log (единственный реальный запуск — dev-compose, 98 событий, 2,5 с), а PromptTemplate/PromptVersion нет в event log — они возвращаются через scripts/dev/seed-prompts.ts
BRB-019Перестать запускать api и web от root в разработкеP3закрыто 2026-08-28 (PR #406)дефект больше не воспроизводитсяdocker/api/Dockerfile:52 и docker/web/Dockerfile:23 запускаются как USER ${DEV_UID}:${DEV_GID} (PR #406, закрыт до того, как находка была выявлена)
BRB-020Дать severity каждому алерту в brabo-alerts.yamlP3открытодефект больше не воспроизводитсяУ всех пяти алертов есть severity: (deploy/k8s/observability/alerts/brabo-alerts.yaml:29,59,87,123,160). Здесь не измерено: «готово, когда» также требует, чтобы операционная панель фильтровала по нему
BRB-021Заполнить пробелы runbook: rollout и инцидент расходовP3открытодефект больше не воспроизводитсяdocs/runbook.md:1671 ## Engine rollout {#rollout-do-engine} и :2899 ## Cost incident {#incidente-de-custo}, оба достижимы из таблицы триажа (:21, :30)
BRB-022Исправить счётчики в прозе, о неверности которых репозиторий уже зналP2закрыто 2026-09-27 (AT-136)дефект больше не воспроизводитсяЗакрыто PR #530: CONTRIBUTING.md:11 (число ADR) сверяется pnpm docs:check, а число схем артефактов в глоссарии выводится из Engine.Harness.ArtifactSchemas (scripts/docs/generate.mjs:623-624), проверено мутацией в обе стороны
BRB-023Обновить vault: ADR 0127, RN-471/472 и расходящееся число ADRP2открытоздесь не проверяемоНаходка — о собственных заметках vault. Репозиторий может дать лишь числа, которые vault должен скопировать, — источник docs/adr/ и файлы RN
BRB-024Удалить ссылки на папки и пути, которых больше нетP3открытополовина репозитория больше не воспроизводится; половина vault здесь не проверяемаREADME.md:296 и docs/getting-started.md:274 говорят apps/api/src/db/schema/<aggregate>.ts, и обе фразы привязаны к коду через verificarFrasesAncoradasNoCodigo; design_handoff_brabo/ встречается только в исторической прозе. Заметки, которые называет находка (UX Designer, Desenvolvimento Local, Comandos), живут в vault
BRB-025Включить apps/api/scripts/ и e2e/ в сгенерированный инвентарь окруженияP3открытодефект больше не воспроизводитсяscripts/docs/fontes-de-env.mjs:49-52 сканирует оба, и новый process.env.X там проваливает docs:check (AT-124, PR #638, измерено мутацией). Оставшаяся открытой половина — после docs:generate ⚠️ не проваливал, и HUGGINGFACE_API_TOKEN/HUGGINGFACE_HUB_URL были закоммичены так — закрылась в AT-211 (2026-09-27): docs:check проваливает любой ⚠️ в инвентаре окружения, в обоих видах источников (scripts/docs/inventario-de-env.mjs, доказано мутацией в inventario-de-env.spec.ts), а обе переменные описаны в configuration.md
BRB-026Реорганизовать docs/adr/index.md — всё начиная с 0044 лежит под «Phase 12»P3открытовсё ещё воспроизводитсяdocs/adr/index.md:143 ## Phase 12 — Post-dogfooding operability всё ещё хранит каждый последующий ADR, и в индексе нет сгенерированного блока
BRB-027Записать методологию таблицы «Escala»P3открытовсё ещё воспроизводитсяНет scripts/docs/escala.mjs, и в docs/architecture.md нет сгенерированного блока масштаба; сама таблица живёт в vault
BRB-028Дать триггер моменту appsec (threat_model)P2закрыто 2026-09-27 (AT-136)дефект больше не воспроизводитсяБыло: у SecOpsAgentServer.run_design/2 не было production-вызывающего, а docs/fluxo.yml называл assess_implementability естественным триггером, объявляя его вне рамок. Смёржено в dev PR #514 (RN-539 — перенумерована с 522, занятой двумя днями ранее): dev_lead_tools.ex:333-338 вызывает его из assess_implementability, ровно там, где по пробелу ему и место, через Dispatcher.run_appsec_design/2 (dispatcher.ex:112); docs/fluxo.yml:188-196 теперь говорит status: active без объявленного пробела. Триггер защищён идемпотентностью, и это не перестраховка: исход :sem_plano просит модель снова вызвать assess_implementability, и каждый новый вызов тратил бы ещё один раунд LLM appsec и ещё три handoff в той же истории. Одно ограничение объявлено в коде: artifact.threat_model выпускается в сессии ИСТОРИИ, а защита читает сессию DEV LEAD — в обычном пути это одна сессия, а когда они различаются — повторный раунд LLM, но никогда не неверные данные
BRB-029Решить судьбу Психолога и Анамнеза (на паузе с 2026-08-10)P2открытоздесь не проверяемо — продуктовое решениеПауза объявлена открытым продуктовым решением в CLAUDE.md и стала обратимой с RN-540; ни один ADR не фиксирует сохранение её выключенной на определённый срок
BRB-030Согласовать дублирующуюся навигацию вкладок (рельс × sidebar)P3открытоздесь не проверяемо — продуктовое решениеCLAUDE.md перечисляет дублирование (LinhaDeAba, RN-196) как принятый пробел и отдельное продуктовое решение, не принятое в ADR 0126
BRB-031Убрать ручной chmod +x из настройки runner через браузерP3закрыто 2026-10-01 (AT-014)дефект больше не воспроизводитсяБыло: File System Access API не сохраняет бит исполнения (docs/adr/0118-configuracao-automatica-do-runner-pelo-navegador.md:134-140), поэтому поток через браузер из ADR 0118 заканчивался ручным chmod +x. Половина закрылась раньше другим путём: install.sh устанавливает бинарник через install -m 0755 (RN-531) и сопрягает машину из терминала (RN-547). Другая половина закрылась решением владельца (01/10) вывести из эксплуатации поток через браузер: ADR 0203 / RN-687 удалил apps/web/src/lib/runner-bootstrap.ts и POST /projects/:projectId/runner-device-keys, а RunnerOnboardingPanel теперь отправляет людей к команде установщика. grep -rn "chmod +x" apps/web/src находит только docblock панели, рассказывающий, почему шаг ушёл. Ключи проекта, зарегистрированные через браузер до этого, остаются действительными и отзываемыми. e2e-покрытие загрузки, которое тоже просила находка, потеряло предмет: загрузки через браузер, которую нужно покрывать, не осталось
BRB-032Broker никогда не поднимался в локальном composeP1закрыто 2026-09-27 только в измеренной половине (AT-136)дефект больше не воспроизводится в двух из трёх половин; третья не испытанаЗакрыто в vault только в измеренной половине. Измерено: broker вышел из profiles: — единственные profiles dev-compose — local-llm (docker/docker-compose.yml:86,126); первопричина — corepack от root при сборке без registry в runtime — исправлена подготовкой COREPACK_HOME при сборке и добавлением healthcheck (PR #503, RN-512), без выдачи сети broker; а .env.example больше себе не противоречит (2026-09-11). Всё ещё открыто: «container_start в проекте container достигает daemon» никогда не испытывалось — для этого нужен образ, выбранный Архитектором (RN-105), которого не было ни в одном измеренном экземпляре
BRB-033reset-total.sh ронял engine, и seed умирал вместе с нимP2закрыто 2026-09-27 (AT-136)дефект больше не воспроизводится718b859e2 — «o reset total sobrevive a si mesmo e para de mentir no fim», смёржено в dev через c230e91af (PR #507). Скрипт теперь опрашивает /health трёх сервисов, и любой сбой завершается с именем шага

На 2026-09-27 vault записывает 10 закрытых (BRB-032 только в измеренной половине), 1 поставленный и ещё не отмеченный закрытым (BRB-007) и 22 открытых. Открытое состояние в vault рядом с «дефект больше не воспроизводится» — не противоречие: это закрытие, которое мейнтейнер ещё не сделал.

Что значат слова в «измерено здесь»​

Это разные слова намеренно. Исправлено было бы суждением мейнтейнера, записанным в vault. Дефект больше не воспроизводится — всё, что этот репозиторий может честно утверждать: поведение, описанное находкой, — не то, что код делает сегодня, на дату строки. Реализовано, ещё не испытано — слабее: код существует и тесты, которые могут выполняться, проходят, но путь исполняется только там, куда этот репозиторий не дотягивается, — на настоящем теге релиза, в CI. Назвать это «исправлено» значило бы заявить доказательство, которого ни у кого нет. Всё ещё воспроизводится и воспроизводится частично говорят, что поведение из находки всё ещё есть, целиком или частично. Здесь не проверяемо говорит, что находка о том, чего этот репозиторий не хранит. Закрытие пункта — и решение, покрывает ли исправление всё, что просила находка, — остаётся там, где находка была выявлена.

BRB-004 — причина, по которой различие стоит своей цены. Прочитанный по id, он выглядел как закрепление ollama:latest, закрытое в #419. Прочитанный в vault, он просил digest, которых не было ни у одного образа. Id — не описание, и именно неверное прочтение держало его открытым, пока у родственного правила для uses: уже с #419 был механизм.

Изменение строки​

Id, заголовок и приоритет копируются из vault дословно, как и состояние в vault; состояние «измерено здесь» и доказательство измеряются здесь. Строка меняется, когда vault меняет её состояние или когда изменение в этом репозитории меняет то, что можно доказать, — никогда ради выдумывания находки.