Skip to content

Привязка инфобазы к ветке хранится под refs/heads/<ветка> — ключом, который читает EDT (#684) - #705

Merged
DitriXNew merged 1 commit into
masterfrom
fix/684-branch-context-full-ref
Oct 3, 2026
Merged

DitriXNew merged 1 commit into
masterfrom
fix/684-branch-context-full-ref

Conversation

@Jimmo910

@Jimmo910 Jimmo910 commented Oct 2, 2026

Copy link
Copy Markdown
Collaborator

Closes #684.

Что было

set_branch_infobase и create_git_branch писали привязку под коротким именем ветки (InfobaseAssociationContext.of(branch)), а EDT ключует контекст ветки ПОЛНЫМ ref: GitRepositoryAssociationContextManager.get возвращает of(repository.getFullBranch()), GitBranchToContextConverter строит of("refs/heads/" + name), а InfobaseAssociationContext.equals сравнивает строки буквально. Поэтому такая привязка никогда не становилась текущим контекстом: EDT не подхватывала её при checkout, а update_database и get_applications её не видели. list_git_branches при этом печатал контексты сырыми строками, и разница была не видна.

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

  • Один общий хелпер utils/git/BranchContexts. Он переводит вход — короткое имя (feature/x) или полный ref (refs/heads/feature/x) — в контекст refs/heads/<ветка>, тот самый, что читает EDT. Remote-tracking ref, любой другой ref, пустое и невалидное для git имя отклоняются с actionable-текстом до любых обращений к репозиторию. Внутренний конвертер EDT не используется, внутренних классов нет.
  • set_branch_infobase привязывает, ставит умолчание и делает read-back под refs/heads/<ветка>. Detach сначала ищет привязку под полным ref, затем под старым коротким ключом. Если снята легаси-запись, ответ говорит об этом в message. Если нет ни той, ни другой, ответ — прежний actionable «not bound», где теперь названы оба ключа.
  • create_git_branch при applicationId привязывает к созданному ref (refs/heads/<ветка>).
  • list_git_branches показывает контекст ветки коротким именем. Любой другой ключ выводится как есть, с пометкой: легаси-ключ (legacy short key - matches no branch, EDT never reads it; detach it with set_branch_infobase), не-веточный ref или коммит detached HEAD.
  • Умолчание. EDT записывает default только для базы, которая привязана и к ВЫГРУЖЕННОЙ ветке: setDefaultInfobase проверяет getAssociation(IProject), а не переданный контекст, и бросает IllegalArgumentException. Это сверено по байткоду 2026.2. Раньше такой отказ превращал уже состоявшийся attach в ошибку. Теперь attach остаётся, а message объясняет причину и даёт совет (выгрузить ветку и повторить с setDefault). Сбой самой платформы (InfobaseAssociationException) тоже идёт в message, но без совета про выгрузку, и логируется, как раньше.
  • Провод. В outputSchema у set_branch_infobase объявлено необязательное message: инструмент возвращает его в двух описанных случаях. Golden против master — ровно эти 3 строки. Описания и inputSchema не менялись. Гайды трёх инструментов описывают настоящий контракт, их копии в docs/tools дословные, чужой дрейф генератора в эти страницы не взят.

Следствие — объявляю явно

Привязки, сделанные этими двумя инструментами, теперь видит сама EDT при checkout, а также get_applications и проверка из #686 в update_database (отказ, если инфобаза цели не привязана к текущей ветке). До этого PR привязка через set_branch_infobase этой проверке не помогала.

Граница

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

  • Юниты: новый BranchContextsTest и расширенные SetBranchInfobaseToolTest, CreateGitBranchToolTest, ListGitBranchesToolTest. Что они проверяют:

    • запись идёт под refs/heads/... и никогда под коротким ключом (пин отсутствия);
    • detach сперва идёт по полному ключу, затем по легаси;
    • read-back идёт по полному ключу;
    • тексты отказа в default и сбоя записи проверяются точным равенством, совет про выгрузку при сбое запрещён;
    • отображение покрыто для полного ref, пустого контекста, легаси-ключа, remote-ref, коммита, имён с / и кириллицей.
  • Мутации — 29, каждая роняет свои пины. Среди них:

    • короткий ключ возвращён в attach/create;
    • сырой контекст в списке;
    • detach без легаси-фолбэка;
    • удвоение refs/heads/;
    • приём refs/remotes/...;
    • совет про выгрузку при сбое записи и потеря совета при отказе;
    • message пропал из outputSchema.

    Восстановление по sha256, target/ тестового бандла чистится перед каждым прогоном.

  • Сборка: BUILD SUCCESS, 8807 юнит-тестов, 0 падений.

  • Стенд (EDT 2026.2), anti-stale: jar 202609221454 заменён на 202610021509; маркер BranchContexts (0 → есть) проверен при положительном контроле; рантайм-проба — новый текст гайда в get_tool_guide.

    • До фикса, на старом jar. list_git_branches печатал сырой refs/heads/master. Attach по короткому имени и затем detach по refs/heads/e2e-684-binding-probe дали отказ is not bound to branch context 'refs/heads/e2e-684-binding-probe': старый писатель клал короткий ключ, а на диске появился каталог контекста e2e-684-legacy-probe/.
    • После фикса. Круговой тест прошёл. Срезы: list_git_branches 5/5, set_branch_infobase 6/6, tools_list 2/2, fixture clean: True. Легаси-ключ, записанный старым jar, показан с пометкой и снят detach-ем с сообщением. Контекст хранится ровно под refs/heads/<ветка>, без удвоения префикса.
    • EDT видит привязку только под refs/heads/<ветка>. Приложение появилось в get_applications лишь после того, как привязка оказалась в контексте refs/heads/master. Привязки под (default) и под коротким ключом EDT не видела.
  • e2e в test_list_git_branches.py:

    • формат-пин без инфобазы (безопасен для CI): в секции привязок нет сырого refs/heads/;
    • живой круговой тест (EDT_MCP_LIVE_INFOBASE=1): attach по короткому имени, затем список, затем detach по ПОЛНОМУ ref. Detach по полному ref добавлен, чтобы тест различал запись по короткому ключу. Честная оговорка: усиленный тест целиком на старом jar не прогонялся. На старом jar он падал раньше, на сыром refs/heads/master, а шаг detach по полному ref проверен там отдельным вызовом (отказ выше).
    • предусловие живого теста — приложение, видимое в get_applications. На стенде его пришлось создать вручную, из-за create_infobase / delete_infobase use the default infobase association instead of the current Git branch's, so the new infobase never appears in get_applications #656: привязку положили в контекст refs/heads/master при остановленном стенде и после прогона удалили.
  • Ревью до push: гейт корректности нашёл настоящий дефект — отказ EDT в default ломал успешный attach; дефект исправлен. Повторный гейт дал SHIP, независимая сверка доказательств стенда — CONFIRMED. PR-бот codex сейчас без квоты; ревью запрошу, как только она вернётся.

🤖 Generated with Claude Code

https://claude.ai/code/session_0174zH13nscxbTgBU4YfXcXK

…ds (#684)

set_branch_infobase and create_git_branch wrote a binding under the bare
short branch name, but EDT keys a branch context by the full ref:
GitRepositoryAssociationContextManager returns
of(repository.getFullBranch()), and InfobaseAssociationContext compares
the strings literally. Such a binding never became the current context:
EDT did not pick it up on checkout, and update_database / get_applications
never saw it.

A shared helper, utils/git/BranchContexts, maps a branch input - its short
name or its refs/heads/... ref - to the context EDT reads, and refuses a
remote-tracking ref, any other ref, a blank or an invalid name before
anything is touched. Both writers attach, set the default and read back
under refs/heads/<branch>. list_git_branches shows a branch context by its
branch name and marks any other key; a binding an older version wrote under
the short name is listed as a legacy key, and a detach removes it and says
so. Nothing is migrated automatically.

EDT records a default only for an infobase that is also bound to the
checked-out branch. A default it refuses after a successful attach no
longer turns the done attach into an error: the attach stands and the
answer's message says why and what to do. A platform failure storing the
default is reported there without that advice, and logged.
set_branch_infobase declares the message it returns in its output schema.

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

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Test Results

8 807 tests  +59   8 802 ✅ +59   6m 14s ⏱️ -1s
  352 suites + 1       5 💤 ± 0 
  352 files   + 1       0 ❌ ± 0 

Results for commit 6520b91. ± 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 12m 26s ⏱️ -3s
1 383 tests +2  1 340 ✅  - 1  43 💤 +3  0 ❌ ±0 
1 386 runs  +2  1 343 ✅  - 1  43 💤 +3  0 ❌ ±0 

Results for commit 6520b91. ± 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

♻️ This comment has been updated with latest results.

@DitriXNew

Copy link
Copy Markdown
Owner

@codex review

@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:50.654787Z 6520b91 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. Breezy!

Reviewed commit: 6520b91023

ℹ️ 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:23
@DitriXNew
DitriXNew merged commit c99edaf into master Oct 3, 2026
21 of 22 checks passed
@Jimmo910
Jimmo910 deleted the fix/684-branch-context-full-ref 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

2 participants