Добавлены разделы о ВПК, алгоритме, ИИ

This commit is contained in:
2026-05-28 16:25:59 +03:00
parent 3673c4aa8d
commit 5c40687011
17 changed files with 1552840 additions and 42 deletions

View File

@@ -2,8 +2,7 @@
' Увеличенный растр для вставки в отчёт (Word / печать)
scale 3
title
Wallenc — старт приложения и параллельная синхронизация
(проектное решение; фоновая синхронизация к реализации)
Wallenc — старт приложения и фоновая синхронизация
end title
skinparam defaultFontName "DejaVu Sans"
@@ -45,32 +44,18 @@ partition "**Основной поток (UI)**" {
fork
partition "**Фон: синхронизация (по таймеру)**" #E8F5E9 {
note right
**Проектная механика (не реализовано в коде)**
• Таймер / WorkManager Android
Таблица в Room: UUID **storage_id**
для очереди синхронизации
Для каждого storage — **история коммитов**
(аналог git): дерево/цепочка снимков
• Сервис: сравнение коммитов
локально vs удалённо → вычисление diff
• Применение изменений →
**одинаковое зашифрованное содержимое**
на клиенте и у провайдера
(ключи на сервер не передаются)
**Реализовано:** StorageSyncEngine,
журнал изменений по путям, merge ревизий
Room: DbStorageSyncGroup (UUID группы)
• WorkManager / debounce — запуск sync
Ключи шифрования провайдеру не передаются
Подробный алгоритм — гл. 4, рис. 35
end note
:По срабатыванию таймера:
запуск **SyncService** / Worker;
:Чтение из БД списка
**UUID storage** из очереди;
while (Есть необработанный UUID?) is (да)
:Загрузить историю **коммитов**
для этого Storage (локально + у провайдера);
:Найти расхождения
(common ancestor / merge);
:Свести содержимое
к единому состоянию;
:Обновить очередь /
метаданные синхронизации;
:Запуск sync (Worker / debounce);
:StorageSyncEngine.syncAllGroups;
while (Есть группа синхронизации?) is (да)
:Слияние журналов → победитель по пути;
:findSourceStorage → applyEntry\nна отстающие Storage;
endwhile (нет)
}
end fork

View File

@@ -0,0 +1,44 @@
@startuml fig_35_sync_merge_algorithm
scale 2.5
title Wallenc — алгоритм согласования журналов синхронизации (StorageSyncEngine)
skinparam defaultFontName "DejaVu Sans"
skinparam activity {
BackgroundColor #F8F8F8
BorderColor #333333
DiamondBackgroundColor #E8F4FF
}
start
:Группа Storage (≥ 2 UUID из DbStorageSyncGroup);
:Захват блокировок sync (lease);
:Параллельно: flush + readSyncJournal\nдля каждого Storage;
partition "Слияние (StorageSyncJournalMerge)" {
:Для каждого пути — запись\nс максимальной ревизией;
note right
compare: sequence → actorId → createdAt
end note
}
while (Есть необработанный путь?) is (да)
:winnerEntry = победитель по пути;
:sourceStorage = findSourceStorage(winnerEntry);
if (operation == UPSERT\nи source == null?) then (да)
:пропуск пути;
else (нет)
while (Есть target Storage?) is (да)
if (ревизия target ≥ winner?) then (да)
:пропуск target;
else (нет)
:applyEntry:\nUPSERT — copy stream\nDELETE/TRASH — на target\n(recordSyncJournal = false);
endif
endwhile (нет)
endif
endwhile (нет)
:Снятие блокировок;
stop
@enduml

View File

@@ -0,0 +1,30 @@
@startuml fig_36_ml_on_device
scale 2.5
title Wallenc — гипотетический контур on-device ML (без расшифровки на сервере)
skinparam defaultFontName "DejaVu Sans"
skinparam componentStyle rectangle
package "Приложение Wallenc" {
[UI / use cases] as UI
[Метаданные:\nжурнал sync, имена,\nразмеры] as Meta
[TFLite / ML Kit\n(inference)] as ML
[Зашифрованные\nфайлы storage] as Enc
}
cloud "Провайдер\n(недоверенный)" as Cloud {
[Зашифрованные\nобъекты] as Obj
}
UI --> Meta : анализ
Meta --> ML : признаки\nбез plaintext
ML --> UI : решение /\nподсказка
Enc --> Cloud : только ciphertext
Enc ..> ML : опционально\nлокальные эмбеддинги\nпосле decrypt на устройстве
note bottom of ML
Обучение: офлайн на размеченных\nсинтетических/агрегированных данных;
выгрузка содержимого vault\nна облако для train — не используется
end note
@enduml