Skip to content

Підтвердження Touch ID для розгалужених стрічок: перегляд до кінця гілки - #66

Merged
0design merged 2 commits into
mainfrom
claude/branch-delivery-preview-20261028
Oct 28, 2026
Merged

0design merged 2 commits into
mainfrom
claude/branch-delivery-preview-20261028

Conversation

@0design

@0design 0design commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Що змінено

Підтвердження через Touch ID тепер працює для розгалужених стрічок, де кожен пункт іде окремою гілкою зі своїм шлюзом (fan-out → workflow-call).

Було. Перегляд доставки (deliveryFor) брав усі рядки, що чекають після шлюзу. Фільтра за гілкою шлюзу не було. Кінець гілки (workflow-return) вважався невідомим кроком, тому перегляд падав з DELIVERY_NOT_READY. Через це не можна було показати зміст і підтвердити жодну гілку.

Стало.

  • Перегляд закінчується на кінці гілки, до якої належить шлюз.
  • Далі він іде, лише якщо всі рядки, що лишилися, — інші гілки того самого закріпленого матеріалу. Матеріал при цьому мусить на кожному шляху зупинятися на людському шлюзі до будь-якої доставки (або не доставляти нічого).
  • Будь-що інше й далі відхиляється з DELIVERY_NOT_READY, наприклад доставка без шлюзу після fan-out. Тож підтвердження однієї гілки не випускає дію, якої людина не бачила.
  • Рядок чужої гілки всередині гілки шлюзу теж відхиляється.
  • Шлюзи в корені прогону працюють як раніше.

Не змінено: перевірки хешу доставки, одноразовий код (nonce) і прив'язка до прогону та шлюзу. Показ у формі, підпис Touch ID і перевірка під час продовження беруть той самий результат deliveryFor. Тіло будує той самий buildBody, що й справжня доставка.

Перевірка

Що Результат
Нові тести test/branch-delivery-preview.test.mjs 6/6 на гілці. На main через саму помилку падають тести 1–3. Тести 4–5 — запобіжники: main ці випадки теж відхиляє, лише з іншим повідомленням. Тест кореневого шлюзу проходить і там, і тут
Перегляд гілки обмежено її власною доставкою так
MCP-перегляд → підпис тестовим ключем Touch ID → доставка байти, дописані у файл, дорівнюють показаному тілу. content_hash у підписі = хеш перегляду. Кожна наступна гілка зупиняється на своєму шлюзі
Гілка з викликом моделі перед шлюзом (модель — локальний мок, без мережі) доставлене = показане. Наступна гілка робить свій виклик і зупиняється на своєму шлюзі
Негатив: доставка без шлюзу після fan-out; шлях гілки з доставкою без шлюзу відхилено (DELIVERY_NOT_READY)
Повний набір npm test у CI цього PR (крок tests) 1736 тестів, 0 FAIL
Повний набір локально в агентській сесії 1688 PASS, 48 FAIL. Ті самі 48 падають і на main: CLAUDECODE is set, nesting guard. Їх покриває лише CI
CI: крок «Registry manifests and generated catalog» і job registry FAIL Core artifact does not match catalog pin. На main цей крок падає так само з моменту злиття попереднього PR (Touch ID). Цей PR його не чіпає
check:public-surface, product-names, naming-inventory, persistence-writes, artifact-secrets PASS
Локальні копії двох реальних розгалужених прогонів (стрічки на 5 і 12 гілок) перегляд через MCP-сервер гілки показує зміст. Відповідь «decline», Touch ID не відкривався, стан копій не змінився
Хеші доставки восьми реальних нерозгалужених прогонів ідентичні до і після зміни

Залишки та межі

  • У перегляді priorStepNames містить лише успішні рядки, а driveRun називає всі попередні. Це вже було в main. На ці кейси не впливає: тіла звірено побайтно.
  • Що вважається дією назовні, збігається з sideEffectOf у workflow-policy.mjs або суворіше: небезпечними вважаються будь-який api-request (зокрема GET), workspace-apply, а також невідомі типи кроків.
  • Вкладені виклики, fan-out і повторювані кроки всередині матеріалу гілки не розбираються, а вважаються небезпечними. Перегляд таких випадків відмовляє, як і раніше.
  • Справжнє підтвердження пальцем на цих прогонах не виконувалося.
  • Злиття в main — лише після рецензії та окремого рішення власника.

🤖 Generated with Claude Code

0design and others added 2 commits October 28, 2026 18:47
A gate inside a fan-out lane (one workflow-call per item) could not be
previewed: deliveryFor treated the lane's workflow-return as an unknown
pending step and refused with DELIVERY_NOT_READY, so Touch ID approval
was impossible for branched feeds.

The preview now ends at the gate lane's return. It continues past that
return only when every remaining pending row is a further lane of the
same pinned material, and that material stops at a human gate before any
delivery on every path (or delivers nothing). Anything else, such as an
ungated delivery after the fan-out, is still refused, so a lane approval
never releases an effect the person was not shown. Rows of another
invocation inside the lane are refused. Root gates are unchanged.

Hash, one-time nonce and run binding checks are untouched; the same
deliveryFor result is shown, signed and recomputed at resume.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@0design
0design force-pushed the claude/branch-delivery-preview-20261028 branch from bbf70c5 to 722f31a Compare October 28, 2026 16:57
@0design
0design marked this pull request as ready for review October 28, 2026 17:02
@0design
0design merged commit 72b1fc7 into main Oct 28, 2026
2 checks passed
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.

1 participant