Skip to content

fix(relay): полагодити червоний CI і актуалізувати карту конформансу - #59

Open
vitaliytv wants to merge 1 commit into
mainfrom
claude/conformance-refresh
Open

fix(relay): полагодити червоний CI і актуалізувати карту конформансу#59
vitaliytv wants to merge 1 commit into
mainfrom
claude/conformance-refresh

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Навіщо цей PR

Прохання було «синхронізувати з origin і актуалізувати стан». Синхронізація показала дві речі, яких карта не відображала.

1. CI на main був червоний — і через мої ж PR

Дві перевірки падали: Lint JS (22 помилки eslint) і Lint Text (2 невідомі слова).

Чому я цього не бачив. Я звіряв дельта-лінт (npx @7n/rules lint — лише змінені файли), а CI ганяє bunx eslint . по всьому дереву з ширшим набором правил. Мої заяви «лінт чистий» були правдиві про те, що я запускав, і не збігались із тим, що перевіряє CI. Це моя помилка в методі перевірки, не в коді.

Виправлено по суті, не заглушками. Найважливіше з знайденого:

  • /\\/+$/ у двох місцях (auth.mjs, fcm-sink.mjs) давав суперлінійний бектрекінг — дешевий вектор ReDoS на рядку з довгим хвостом слешів. Обидва місця нормалізують зовнішні адреси (baseUrl Kratos, endpoint FCM), тобто вхід не завжди наш. Замінено циклом.
  • node-глобали не імпортовані (process, URLSearchParams, Buffer, TextDecoder) — у ESM це не дрібниця, а залежність від того, що рантайм їх підкладе.
  • Решта механічна: toSorted, Iterator#toArray, порядок членів класу, Promise.withResolvers, base64url через Uint8Array.

Після правок: 0 errors (3 warnings, які CI не валять), 197 тестів зелені, cspell чистий на 185 файлах.

2. Карта показувала зріз від 9 серпня

Її власне правило — «зріз без дати й методу не зріз», а відтоді змінилось усе. Оновив дату, звірив заявлені шляхи з деревом, перевірив, що з цього реально ганяє CI.

Новий розділ «Стан сторожів»

Критерій зняття -draft спирається на тести — отже їхній власний стан є частиною зрізу, а не деталлю. Виявилось:

  • cargo test не запускається в CI жодним workflow. Rust-половина критерію не має автоматичного сторожа взагалі — її тримає лише ручний прогін.
  • Серійно падає 1 тест (cascade_exhausted_or_plain_error_paths), паралельно — до 10: драбина міряє реальний час (budget_hard_sec), а шими спавняться процесами, тож під навантаженням вони ловлять budget-exceeded замість failed.

Поки це так, «усі рядки РЕАЛІЗОВАНО» не дорівнює «доведено» — і краще, щоб це стояло в документі, ніж жило в голові.

Три рядки виправлено після звірки

  • PII-directory — було ЧАСТКОВО, насправді мертвий код: викликів немає жодного, тому Escalation.to_account_id порожній і адресний push типу 3 для ескалацій де-факто не працює.
  • i18n: lang у ClientHello — було РЕАЛІЗОВАНО; поле приймається, але далі хендшейку його не читає ніхто.
  • Retry ladder — додано, що його тести чутливі до навантаження.

3. «Відкриті питання» більше не порожні

Там стояло «немає». Тепер вісім пунктів, і кожен — рішення, а не залишок роботи. Найгостріші:

  • Пісочниця називається sandbox, але лише радить. Жорстка відмова працює там, де агент питає дозволу; автономний CLI MT не перехоплює. Або реальна ізоляція (sandbox-exec/bubblewrap), або чесна фіксація в спеці, що це декларативна політика для кооперативних виконавців.
  • directory.rs мертвий десятий тиждень — і саме через це не працює адресний push для ескалацій. Дописати резолв або видалити (прецедент mt-napi); тримати мертвим — найгірше з трьох.
  • Live-переклад стрічки не має власника — виклик моделі на кожну текстову подію в гарячому шляху; хост, relay чи відкласти.
  • MCP: набір проєкту проти набору ходу — звуження вимагає рвати ACP-сесію на кожному перемиканні surface, тобто рвати контекст розмови заради економії контексту.

Решта — гейт без вузла кімнати, layers/ проти i18n.rs, автор decision-request, і що робити з Rust-тестами в CI.

CI на main був червоний на двох перевірках, і обидві — наслідок моїх
попередніх PR. Причина в тому, що я звіряв дельта-лінт (змінені файли), а
CI ганяє eslint по всьому дереву: 22 помилки, яких дельта не показувала.

Виправлено по суті, не заглушками:
- regex `/\\/+$/` у двох місцях давав суперлінійний бектрекінг (ReDoS на
  рядку з довгим хвостом слешів) — замінено циклом;
- node-глобали (process, URLSearchParams, Buffer, TextDecoder) імпортовано
  явно, як вимагає ESM;
- base64url через Uint8Array замість Buffer;
- решта — механічні правила (toSorted, Iterator#toArray, порядок членів
  класу, Promise.withResolvers).

Карта конформансу актуалізована: зріз мав дату 9 серпня, хоча відтоді
змінилось усе. Заявлені шляхи звірено з деревом.

Додано розділ «Стан сторожів»: критерій зняття -draft спирається на
тести, тож їхній власний стан — частина зрізу. cargo test не запускається
в CI ЖОДНИМ workflow, тобто Rust-половина критерію не має автоматичного
сторожа; серійно падає 1 тест, паралельно — до 10, бо драбина міряє
реальний час.

«Відкриті питання» більше не порожні: вісім пунктів, кожен — рішення, а
не залишок роботи. Серед них: sandbox називається пісочницею, але лише
радить; directory.rs мертвий десятий тиждень, через що адресний push для
ескалацій де-факто не працює; live-переклад стрічки не має власника.
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