Skip to content

get_metadata_details: право роли на подчинённый объект показывается под его собственным адресом (#685) - #703

Merged
DitriXNew merged 1 commit into
masterfrom
fix/685-role-rights-object-address
Oct 3, 2026
Merged

DitriXNew merged 1 commit into
masterfrom
fix/685-role-rights-object-address

Conversation

@Jimmo910

@Jimmo910 Jimmo910 commented Oct 2, 2026

Copy link
Copy Markdown
Collaborator

Closes #685.

Что было

RoleRightsReader.objectFqnOf для цели, которая не является top-объектом, брал FQN верхнего объекта (bmGetTopObject().bmGetFqn()). Поэтому право на Catalog.X.Attribute.Y в матрице прав и в таблице RLS выглядело как право на Catalog.X. Запись при этом принимает полный адрес (RoleRightsWriter.resolveObject → MetadataNodeResolver.resolveExisting), а в Rights.rights лежат два разных узла — чтение и запись были несимметричны.

Что изменилось

  • В колонке Object теперь адрес, который резолвится обратно в тот же объект через MetadataNodeResolver.resolveExisting, — форма, которую принимает rights[].object у modify_metadata: Catalog.X.Attribute.Y, Document.D.TabularSection.T.Attribute.A, InformationRegister.R.Dimension.D, Catalog.X.Command.C и т.д. Верхний объект по-прежнему выводится через bmGetFqn.
  • Построитель адреса жил приватной копией в VendorSupportGuard.objectAddress. Он перенесён в MetadataNodeResolver рядом с kindTokenForFeature: addressOf — побайтовый перенос (гард делегирует, его тесты не менялись) и строгий resolvableAddressOf, который отвечает null, если хоть один шаг не адресуем грамматикой резолвера, верхний объект — не тип конфигурации или у уровня нет имени. Третьей копии нет; CommandInterfaceSupport.mdObjectFqn не тронут — его семантика другая.
  • Неадресуемые цели (стандартные реквизиты и прочие не-MdObject, подчинённые не-конфигурационных верхних объектов) показываются, как и раньше, под FQN верхнего объекта — об этом было сказано в ишью при взятии. Отсоединённые объекты сохраняют прежний откат.
  • Гайд get_metadata_details (раздел ролей) говорит, что колонка Object — это адрес для rights[].object. В docs/tools/get_metadata_details.md абзаца про роли не было вовсе (дрейф после Развёртка осиротевших прав ролей: отчёт по умолчанию, удаление доказанных сирот по запросу #687, генератор не запускали) — вставлен дословно, на то же место, что в гайде. Описания инструментов, inputSchema, golden и MANIFEST не менялись.

Доказательства

  • Юнит, RoleRightsReaderTest: воспроизведение ишью на моках с подключённым BM (на master обе строки были Catalog.OrphProbeB), вид по умолчанию, табличная часть и её реквизит, измерение/ресурс/реквизит регистра, команда, пин проводки таблицы RLS — все красные на master. Стражи: верхний объект через bmGetFqn; неадресуемый подчинённый (стандартный реквизит табличной части показан под каталогом, а не под табличной частью); отсоединённые откаты.
  • Юнит, MetadataNodeResolverTest: токены видов на каждом уровне; программное Name, а не синоним; null для шага вне грамматики, для не-конфигурационного верхнего объекта и для безымянного уровня; контракт полного круга resolvableAddressOf → resolveExisting на 25 объектах.
  • Мутации — 11, каждая роняет свой пин: подчинённый снова под FQN верха; матрица или RLS мимо адреса; потерян токен вида; синоним вместо имени; неадресуемый шаг напечатан; снята проверка типа верха; принят безымянный уровень; откат на непосредственного владельца; плюс две текстовые мутации гайда. Восстановление по sha256, target/ тестового бандла чистится перед каждым прогоном.
  • e2e: новый test_role_rights_read_attribute_row_carries_its_full_address — сценарий из ишью: права на каталог и на его реквизит дают две разные ячейки Object (сверка ячеек целиком, не подстрок: FQN каталога — префикс адреса реквизита); прочитанный адрес записывается обратно (unset), право на реквизит исчезает, право на каталог остаётся. Локально не запускался — его первый прогон в этом CI на EDT 2026.2.1.
  • Сборка: BUILD SUCCESS, 8767 юнит-тестов, 0 падений (известный локальный флейк MergeRulesToolTest.tearDown DirectoryNotEmpty один раз, повтор зелёный).
  • Ревью до push: два независимых гейта (корректность; честность тестов) — SHIP и 6 замечаний P3, все вшиты.

🤖 Generated with Claude Code

https://claude.ai/code/session_0174zH13nscxbTgBU4YfXcXK

…own address (#685)

RoleRightsReader named a non-top rights target by its top object's FQN, so a right
on Catalog.X.Attribute.Y read as a right on Catalog.X, in the rights matrix and in
the RLS table, while modify_metadata accepts (and Rights.rights stores) the full
address.

The Object cell is now the address that resolves back to the same object through
MetadataNodeResolver.resolveExisting, the form rights[].object accepts. The address
builder moved from VendorSupportGuard into MetadataNodeResolver as addressOf (same
behaviour, the guard delegates) with a strict resolvableAddressOf that answers null
when a step is not addressable. Such targets keep the top object's FQN as before,
and detached objects keep their fallback. The get_metadata_details guide and its
docs page say so; a new e2e reads the attribute row and writes the read address back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0174zH13nscxbTgBU4YfXcXK
@Jimmo910

Jimmo910 commented Oct 2, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review — самое рискованное место: строгий resolvableAddressOf — есть ли подчинённый вид, для которого напечатанный адрес резолвится в другой объект или не резолвится вовсе (то есть чтение и запись прав снова расходятся).

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Repo admins can enable using credits for code reviews in their settings.

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Test Results

8 767 tests  +19   8 762 ✅ +19   6m 12s ⏱️ -1s
  351 suites ± 0       5 💤 ± 0 
  351 files   ± 0       0 ❌ ± 0 

Results for commit 54951af. ± Comparison against base commit d62c416.

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

E2E Test Results (EDT 2026.2)

    4 files  ±0      4 suites  ±0   1h 15m 45s ⏱️ + 3m 16s
1 382 tests +1  1 340 ✅  - 1  42 💤 +2  0 ❌ ±0 
1 385 runs  +1  1 343 ✅  - 1  42 💤 +2  0 ❌ ±0 

Results for commit 54951af. ± Comparison against base commit d62c416.

This pull request skips 2 tests.
create_git_branch::test_branch_already_exists_errors_without_creating_anything
switch_git_branch::test_switching_to_the_current_branch_is_rejected

@DitriXNew

Copy link
Copy Markdown
Owner

@codex review — самое рискованное место: строгий resolvableAddressOf — есть ли подчинённый вид, для которого напечатанный адрес резолвится в другой объект или не резолвится вовсе (то есть чтение и запись прав снова расходятся).

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-03T20:26:05.503174Z 54951af Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Bravo.

Reviewed commit: 54951af04a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@DitriXNew
DitriXNew marked this pull request as ready for review October 3, 2026 20:22
@DitriXNew
DitriXNew merged commit febf069 into master Oct 3, 2026
16 checks passed
@Jimmo910
Jimmo910 deleted the fix/685-role-rights-object-address branch October 3, 2026 21:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Права роли на реквизит показываются под именем объекта-владельца

2 participants