Замінюємо файловий handoff (outbox-to-desktop / inbox-from-desktop) на двосторонній mTLS-канал зі structured messages. VPS-Claude (я) і Desktop-Claude бачать handoff'и миттєво, без ls outbox-to-desktop/. Кожне повідомлення підписане ed25519, не може бути підкладене третьою стороною з root-доступом до VPS.
Запозичено з ruflo Federation, але мінімалістично — без trust-scoring layer, без cross-machine swarms (це overkill для однієї пари VPS+Desktop).
Write /root/.claude/projects/-/memory/outbox-to-desktop/<timestamp>-<topic>.mdadditionalContextssh root@31.131.26.203 'cat outbox-to-desktop/*.md' (вручну)cat note.md | ssh root@31.131.26.203 'cat > inbox-from-desktop/<timestamp>-topic.md'processed/ ручним mvmv processed/, інакше дубль-обробка┌──────────────┐ ┌──────────────┐
│ VPS Claude │ ───── mTLS WSS ──── │ Federation │
│ (Telegram │ ←──── push events ── │ Broker │
│ bot) │ ───── ed25519 sig ─ │ (на VPS) │
└──────────────┘ └──────────────┘
↑
│ mTLS WSS
↓
┌──────────────┐
│Desktop Claude│
│ (Windows / │
│ Cowork) │
└──────────────┘
/srv/services/federation-broker/, Python + websockets + sqlite)
federation.deltamedicalservices.online (після NS-handoff)messages table (id, from, to, payload_json, signature, created_at, delivered_at, ack_at, status)federation_client.py, embedded в обох Claude-сесіях)
fed.send(to, topic, payload), fed.poll(since), fed.ack(message_id)/srv/passepartout/federation/)
vps-claude.crt, desktop-claude.crt{
"id": "2026-05-10T12:00:00Z-abc123",
"from": "vps-claude",
"to": "desktop-claude",
"topic": "superpowers-plugin-trial",
"priority": "normal",
"payload": {
"type": "task",
"title": "Обкатати obra/superpowers",
"body": "...markdown text...",
"actions": ["install", "test", "report"]
},
"signature": "ed25519-base64-...",
"ts": "2026-05-10T12:00:00Z"
}
Замість Write /root/.claude/projects/-/memory/outbox-to-desktop/...md:
fed.send(to="desktop-claude", topic="superpowers-plugin-trial",
payload={"type": "task", "title": "...", "body": "..."})
Або через slash-команду: /fed-push desktop-claude task "Обкатати obra/superpowers"
Замість читання outbox у SessionStart:
/fed-list показує всі непрочитані/fed-ack <id> — відмічає прочитаним (без ручного mv processed/)/srv/services/federation-broker//srv/passepartout/federation/federation-broker.service, Caddy reverse-proxy на 8090federation_client.py — async listener + send APIfed-cli send|list|ack/usr/local/bin/session-start-check.sh)Загалом: 3 дні роботи.
| Ризик | Mitigation |
|---|---|
| Broker впав → handoff'и стоять | systemd auto-restart + Watchdog моніторить health endpoint + fallback на file-based |
| Desktop offline → повідомлення в очікуванні | sqlite queue зберігає до reconnect (TTL 7 днів) |
| mTLS certs протухли | Cron-нагадування за 30 днів до expiry + Watchdog алерт |
| Race condition між file-based і broker під час migration | Spec: новий handoff пише ТІЛЬКИ в один з каналів, обидва listener'и відпрацьовують ідемпотентно |
| Хтось з root-доступом VPS впише фейкове від мого імені | mTLS не врятує (root має ключ), але можна ротати ключі швидше + audit log у sqlite |
Federation і SPARC незалежні. Можна робити паралельно або послідовно:
Federation НЕ впливає на PM-Agent / Dev Crew логіку. Це окремий transport layer.
federation.deltamedicalservices.online (потрібно дочекатись NS-handoff з Hostiq на Cloudflare). Поки на 31.131.26.203:8090 з self-signed CA — ОК?Після ОК Сергія:
status: approved01-specification.md за SPARC-методикою (тобто і для самого Federation робимо SPARC-pipeline)