Skip to content

feat(agent-server): orchestrator-роль із подієвим wake - #41

Open
vitaliytv wants to merge 1 commit into
mainfrom
claude/orchestrator-role
Open

feat(agent-server): orchestrator-роль із подієвим wake#41
vitaliytv wants to merge 1 commit into
mainfrom
claude/orchestrator-role

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Хвиля 3 — orchestrator-роль

runtime.md, «Wake: push замість polling»: базовий MT прокидався cron-ом кожні 5 хвилин; цільова архітектура має три джерела пробудження і на кожне виконує ту саму трійку mt watch-логіки.

Усі три джерела

Джерело Реалізація
relay push «є нові події у задачі X» AppState::wake_orchestrator — хост ресканить негайно, не чекаючи таймера
post-merge git hook touch .mt/wake
періодичний tick fallback — щоб при недоступному relay система працювала як базовий MT, а не зупинялась

Один привід — одне прокидання: сигнал споживається, mtime файлу запам'ятовується. Інакше кожна ітерація циклу перезапускала б dispatch на тій самій події.

Порядок усередині tick

dispatch → алерти → GC, і він не випадковий:

  • dispatch першим — заради нього хост і прокидається;
  • алерти після нього, щоб вузол, який щойно став unresolvable у цьому ж прогоні, потрапив у той самий звіт, а не чекав наступного wake;
  • GC останнім — він прибирає за тим, що вже завершилось.

Алерти дедуплікуються за станом процесу, а не файлом-міткою: алерт — це доставка, а не артефакт графа, тож перезапуск хоста має право нагадати про вузол, який усе ще чекає людину.

Компроміс, який варто знати

Опитування .mt/wake замість inotify. Інотифай додав би залежність і платформні гілки заради того, що на масштабі одного репозиторію коштує один stat на 200 мс.

Побічно закриває хвіст хвилі 2

Алерт при unresolvable тепер має того, хто його помічає — рядок карти переведено в РЕАЛІЗОВАНО (доставка назовні лишається за push-транспортом M2).

Тести

5: алерт раз на вузол; алерти доходять до вкладених вузлів; явний сигнал будить негайно і споживається; touch файлу будить, а сама його наявність — ні; fallback повертає без події. 360 passed, clippy чистий.

Далі в хвилі 3

Тригери аудиту за розкладом (audit_schedule_days/audit_on_patch) — тепер це просто ще одна робота в tick. Плюс злиття agent-cli у mt serve|attach, backpressure за спекою, глибокий реплей із run ref.

🤖 Generated with Claude Code

Хвиля 3. runtime.md, «Wake: push замість polling»: базовий MT прокидався
cron-ом кожні 5 хвилин; цільова архітектура має три джерела пробудження,
і на кожне виконує ту саму трійку mt watch-логіки.

Реалізовано всі три джерела:
- relay push «є нові події у задачі X» -> AppState::wake_orchestrator,
  тобто хост ресканить негайно, а не чекає таймера;
- touch .mt/wake від post-merge git hook;
- періодичний tick як FALLBACK — щоб при недоступному relay система
  працювала як базовий MT, а не зупинялась.

Один привід — одне прокидання: сигнал споживається, mtime файлу
запам'ятовується. Інакше кожна ітерація циклу перезапускала б dispatch
на тій самій події.

tick(): dispatch -> алерти -> GC. Порядок не випадковий: dispatch
першим, бо заради нього хост і прокидається; алерти після нього, щоб
вузол, який щойно став unresolvable у цьому ж прогоні, потрапив у той
самий звіт; GC останнім — він прибирає за тим, що вже завершилось.

Алерти дедуплікуються за станом процесу, а не файлом-міткою: алерт це
доставка, а не артефакт графа, тож перезапуск хоста має право нагадати
про вузол, який усе ще чекає людину.

Опитування .mt/wake замість inotify — свідомий компроміс: інотифай додав
би залежність і платформні гілки заради того, що на масштабі одного
репозиторію коштує один stat на 200 мс.

Це закриває і хвіст хвилі 2: алерт при unresolvable тепер має того, хто
його помічає.

Тести: 5 — алерт раз на вузол, алерти доходять до вкладених вузлів,
явний сигнал будить негайно і споживається, touch файлу будить (а сама
наявність файлу — ні), fallback повертає без події.
360 passed, clippy чистий.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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