Skip to content

docs: ci_artifact/consume — обґрунтований не-порт у wasm-гість ci-github - #581

Merged
vitaliytv merged 1 commit into
mainfrom
feat/ci-artifact-consume-native
Aug 31, 2026
Merged

docs: ci_artifact/consume — обґрунтований не-порт у wasm-гість ci-github#581
vitaliytv merged 1 commit into
mainfrom
feat/ci-artifact-consume-native

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Summary

Задача — пункт 3 плану docs/plans/2026-08-29-js-rust-migration-completion-plan.md: портувати концерн ci_artifact/consume плагіна ci-github (plugins/ci-github/rules/ci_artifact/consume/{main.mjs,fix-consume.mjs}) у wasm-гість crates/plugin-ci-github. Єдиний концерн репозиторію, де не портовано жодної половини (ні detect, ні fix).

Результат: не портовано, структурний блокер контракту. Розвідка ПЕРЕД кодом (правило §2.81) підтвердила й розширила короткий доккоментар, який уже стояв у crates/plugin-ci-github/src/lib.rs:90-104ci_artifact/consume і решта ga/* — поза обсягом»):

Концерн — не звичайна перевірка файлів консюмер-репо, а generic-consumer слоту ci.artifact@1: читає граф ІНШИХ плагінів консюмера (collectCiArtifactContributionsresolveSlotGraph/getSlotContributions), валідує чужі payload-и, ловить domain-колізії й вантажить canonical-шаблони з ЇХНІХ пакетів. Три незалежно перевірені канали блокування:

  1. host-context (world.wit) знає лише repo-root@1/scratch-dir@1 — жодного import-у для резолву слот-графа інших плагінів.
  2. wit/deps/slots/ci-artifact.wit типізує лише producer-бік (manifest.ci-artifacts — що гість ВНОСИТЬ), не consumer-бік (що гість ЧИТАЄ в інших).
  3. Новий, раніше не задокументований пункт: сам template-файл лежить у пакеті ІНШОГО плагіна (resolveArtifactTemplatePathcontribution.packageRoot, plugins/ci-github/slots/ci-artifact-consumer.mjs) — поза capabilities.fs-read/repo-root@1, які скоуплені на консюмер-репо поточного виклику, не на встановлені директорії плагінів. Навіть гіпотетичний новий host-import для резолву графа сам по собі цього б не зняв.

Порт інвертував би шар компонентної моделі: гість одного плагіна вирішував би за весь крос-плагінний граф — sandbox-межа, не «просто ширший скоуп».

Зміни

  • docs/plans/2026-08-05-open-questions-register.md — новий запис §2.98 (кінець файлу): повний доказ трьох каналів блокування, чому це інверсія шару, що зняло б блокер (новий host-mediated import, який резолвить граф і читає чужі шаблони ХОСТ-стороною — окрема задача рівня контракту), і два уроки.
  • crates/plugin-ci-github/src/lib.rs — доккоментар розділу «ci_artifact/consume і решта ga/* — поза обсягом» доповнено перехресним посиланням на §2.98 (третій канал блокування, якого коротка версія не називала явно).

Коду плагіна НЕ змінено. JS-канон (main.mjs + fix-consume.mjs) лишається — портувати нема що. Гейт складу резолву npm/scripts/lib/lint-surface/tests/wasm-plugin-parity-ci-github.test.mjs (§2.90) не чіпається: він звіряє склад для концернів manifest.concerns живого гостя, а ci_artifact/consume там і не заявлений — гість про нього не заявляє взагалі.

Test plan

  • cargo check -p rules-contract -p plugin-ci-github — компілюється чисто (лише доккоментар).
  • Код плагіна не змінювався — вихідний cargo test -p plugin-ci-github/wasm-plugin-parity-ci-github.test.mjs поведінково не зачеплені (гейти §2.90 не редаговано).
  • Незалежно перевірено проти джерела: crates/rules-contract/wit/world.wit (host-context slots, рядки ~677-708), crates/rules-contract/wit/deps/slots/ci-artifact.wit, plugins/ci-github/slots/ci-artifact-consumer.mjs (resolveArtifactTemplatePath) — усі цитати в §2.98 перевірені читанням файлів, не з памʼяті.

🤖 Generated with Claude Code

Розвідка ПЕРЕД кодом (задача — п.3 плану migration-completion):
concern ci_artifact/consume плагіна ci-github читає слот-граф ІНШИХ
плагінів консюмера (collectCiArtifactContributions → resolveSlotGraph)
і вантажить canonical-шаблони з ЇХНІХ пакетів. Гість не має каналу
контракту для жодного з двох входів:

- host-context знає лише repo-root@1/scratch-dir@1 — немає імпорту
  для резолву слот-графа;
- wit/deps/slots/ci-artifact.wit типізує лише producer-бік
  (manifest.ci-artifacts), не consumer-бік;
- (новий, раніше не задокументований канал) сам template-файл лежить
  у пакеті ІНШОГО плагіна — поза capabilities.fs-read/repo-root@1,
  які скоуплені на консюмер-репо, не на встановлені директорії
  плагінів.

Порт інвертував би шар: гість одного плагіна вирішував би за весь
граф — sandbox-межа компонентної моделі, не питання «ширшого скоупу».
JS-канон (main.mjs + fix-consume.mjs) лишається — знімати нема що
портувати; гейт §2.90 (wasm-plugin-parity-ci-github.test.mjs) не
чіпається, бо концерн і не входить у манифест гостя.

Доккоментар crates/plugin-ci-github/src/lib.rs (§2.81, ДРУГА хвиля)
уже мав цей висновок коротко — доповнено перехресним посиланням на
повний доказ у реєстрі.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vitaliytv
vitaliytv merged commit 232194c into main Aug 31, 2026
1 of 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