Another yet federated messenger.
  • Rust 65.1%
  • TypeScript 26%
  • Dart 6.6%
  • CSS 1.7%
  • JavaScript 0.2%
Find a file
kiper220 a52e69816f feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2)
## Что в PR

Три независимых блока (3 атомарных коммита над baseline):

### 1. Верификация collision-guard (server)
P0-гард `ensure_remote_shadow_ids_free` уже стоял в коде. Добавлено:
- **regression-тест** — remote Welcome с коллизией UUID не перезаписывает локальный sentinel, не пишет inbox-receipt и повторно доставляем после очистки (`tests/social.rs`);
- **негативный тест authority-guard** для пути federated-conversation (`tests/federated_conversation_writes.rs`);
- **доки** — гард помечен как транзитный до миграции на composite/surrogate-ключи (`docs/11`, `docs/12`).

Production-логика не менялась (только rustfmt-реформат).

### 2. Federated call integration-тесты (server)
Two-home round-trip start/end звонка, idempotent duplicate, shadow-authority guard для calls-пути (`tests/calls.rs`). Путь уже был реализован и врезан — теперь покрыт тестами.

### 3. DSG-оркестратор: Фаза 1 + Фаза 2a (client-web)
**Фаза 1 — Welcome trust-gate:** `DsgProjectionStore` + `DsgAcceptedCommitVerifier` + `DsgWelcomeRosterPolicy` (оба порта реализованы, exact-match, fail-closed). Врезан в production credential-policy: гард реальный, store пуст до Фазы 2 → join остаётся fail-closed (`MLS_WELCOME_ROSTER_MISMATCH` вместо `UNCONFIGURED`).

**Фаза 2a — feed-transport:** crash-safe DSG envelope feed (`device.sync.envelopes.pull/ack`) — loop + page-parser + atomic IndexedDB opaque-inbox + realtime wake-ветка `device_sync_events_available`; врезан в репозиторий (durable-ингест opaque-конвертов).

## Статус / что НЕ в PR
- MLS-обработка DSG-конвертов, `DeviceSyncPayload`-кодек/snapshot-reducer, наполнение projection-store и candidate-join — **Фаза 2b/2c**.
- **Открытый design-вопрос (блокер join'а):** в текущей реализации нет канала доставки initial DSG Welcome кандидату (chicken-and-egg: `DsgWelcomeBootstrap` — это DSG application, нечитаемое non-member'ом). Документированный `DeviceAddOperation` server-transition flow (docs/09:325) разошёлся с реализацией и нуждается в уточнении перед 2c.

## Валидация
- `cargo test -p guildwine-server` — social 7/7, federated_conversation_writes 5/5, calls 5/5; `clippy -D warnings`, `fmt` — чисто.
- client-web — 177 тестов (вкл. 16 новых DSG) + `build:types`; apps/web `tsc -b` + 14 тестов — зелёные.

Reviewed-on: #2
2026-08-08 11:50:09 +00:00
.cargo feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
apps feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
crates feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
docs feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
packages feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
.env.example feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
.gitignore feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
Cargo.lock feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
Cargo.toml feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
context.md feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
LICENSE Initial commit 2026-07-23 12:32:10 +00:00
package-lock.json feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
package.json feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00
README.md feat: DSG Orchestrator: Trust Gate and Feed Transport (Phases 1–2a) + Federation Boundary Verification (#2) 2026-08-08 11:50:09 +00:00

GuildWine

Основа федеративного криптографического MLS-мессенджера: Rust-сервер, общий wire protocol и одна stateful клиентская библиотека для Web/PWA, Android Flutter и будущего desktop-клиента.

Что реализовано

Серверная foundation:

  • typed transactional RocksDB и bounded migrations;
  • точный indexed TTL;
  • WebSocket auth и protocol frames;
  • durable per-device event replay/ACK/retention;
  • signed/idempotent commands;
  • публичный account profile с CAS и durable fan-out на все устройства;
  • bounded каталог Space/Conversation/Topic на явном per-user индексе;
  • базовые persistence boundaries для spaces/conversations/topics;
  • public space/direct/invite/role/topic social slice;
  • opaque MLS conversation events, атомарный epoch CAS и durable local wake;
  • QR enrollment, межустройственный relay и chat-add lease foundation;
  • signed federation transport, authority-routed remote conversation commands и canonical shadow feed на home отправителя;
  • sponsor-authored Add/Commit/Welcome и activation ACK для local и two-home invite/direct;
  • LiveKit token provisioning и atomic call projection;
  • опциональное зашифрованное файловое хранилище с quota и recovery.

Клиентская foundation:

  • high-level facade и расширяемый executable feature registry;
  • bounded actor, FIFO write lane и параллельные queries;
  • immutable reactive snapshots;
  • typed encrypted storage, TTL, CAS, opaque cursors и resumable migrations;
  • реальный OpenMLS engine, device-signed credential, WASM adapter, WebCrypto/IndexedDB vault и crash-safe pending coordinator;
  • Worker/WASM/React PWA, Android Flutter и Iced application shells.

Production web repository собирает OpenMLS/WASM coordinator с WebCrypto/IndexedDB vault и асинхронный cross-home queue/status/redrive с подтверждением по canonical event. Пока не завершены concrete DSG trust/snapshot orchestration и authoritative roster DTO для Welcome, production encryption локальной расшифрованной истории, multi-tab leadership, межустройственная передача file secrets через DSG и remote LiveKit active/token-grant. Cross-home blob discovery/download уже выполняется через проверенный /.well-known/guildwine/client/v1; Queued не равен принятию события authority. Типизированная адресная модель home + local уже входит в общий protocol и client API. Документация явно отделяет работающий scaffold от целевых контрактов.

Быстрые проверки

cargo xtask check
cargo xtask check-all

check компилирует Rust-документацию, запускает lints, обычные Rust tests и отдельные doctests, а затем проверяет WASM target. check-all дополнительно выполняет Web tests и реальную Rust→WASM→Vite сборку, Flutter analyze/tests, debug APK через Cargokit/NDK и Iced check. Для него нужны Node.js, подходящий wasm-bindgen-cli, Flutter и Android SDK/NDK.

Точечные entry points:

cargo xtask web dev
cargo xtask mobile run
cargo xtask desktop run

Запуск сервера

GW_SERVER__BIND="127.0.0.1:8080" \
GW_SERVER__DATABASE="./db" \
GW_SERVER__GRACEFUL_SHUTDOWN_TIMEOUT_MS=30000 \
GW_REGISTRATION__INITIAL_TOKEN="replace-me" \
GW_REGISTRATION__INITIAL_TOKEN_MAX_REGISTRATIONS=1 \
GW_WELLKNOWN__DOMAIN="example.org" \
GW_WEB__STATIC_DIR="./apps/web/dist" \
cargo run -p guildwine-server

Локальный .env загружается для разработки. Реальные environment values имеют приоритет над ним и над /etc/guildwine/config.*. Два подчёркивания разделяют уровни: GW_SERVER__REQUEST_BODY соответствует server.request_body. GW_SERVER__GRACEFUL_SHUTDOWN_TIMEOUT_MS ограничивает drain HTTP/WebSocket после SIGINT/SIGTERM; после deadline Axum task abort-ится, а worker cleanup всё равно выполняется.

GW_WEB__STATIC_DIR опционален. Если он задан, сервер раздаёт собранную Vite PWA, безопасный SPA fallback и /.well-known/guildwine/client/v1 с того же origin. Перед запуском выполните npm run build:web. Без этой переменной web assets должен раздавать reverse proxy; WebSocket и API продолжают работать.

Документация

Перед feature-разработкой прочитайте соответствующий foundation contract и запустите проверки слоя, который меняете.