Обновлено: 2026-04-18
Статусы: ✅ Done · 🟡 Partial/Skeleton · ⏸ Not started
Living doc — обновляется после каждого шага по правиламCLAUDE.md(Workflow: Definition of Done).
| Модуль | Что есть | Что не сделано | Статус | Последний апдейт |
|---|---|---|---|---|
| core | CommitteeType/Code, DomainException (sealed), DocumentEntityType, AbstractEntity, все JPA entities, repositories | доменные records (Agenda, Question, Vote) — добавятся вместе с портами | ✅ | 2026-04-13 |
| document | DocumentTemplateType, 26 шаблонов, ReportGenerator | — | ✅ | 2026-04-13 |
| protocol — CRUD | ProtocolCrudService, ProtocolHistoryService, ProtocolSpecifications, DTO records | — | ✅ | 2026-04-17 |
| protocol — ports | — | AgendaProvider, ExtractProvider, ExtractSynthesizer | ⏸ | — |
| protocol — generator | — | ProtocolGenerationContext, ProtocolGenerator (4 фазы + StructuredTaskScope), ProtocolAssembler, report strategies | ⏸ | — |
| signature | FileSignatureStrategy (интерфейс) + FileSignatureStrategyResolver (registry), DTO records | AbstractFileSignatureStrategy (Template Method), конкретные стратегии (Extract/Protocol/Question), SignatureService, SignatoryService | 🟡 Skeleton | 2026-04-16 |
| integration | — | Feign-клиенты, ACL-мапперы, адаптеры | ⏸ | — |
| extract | — | Бизнес-логика, стратегии, адаптеры портов protocol | ⏸ | — |
| core — error hierarchy | DomainException sealed ADT (+ nested Integration 6 подтипов, ExternalSystem enum) в core.domain.error |
— | ✅ | 2026-04-18 |
| core — domain records | Agenda/Question/Vote/Extract/QuestionFile/AgendaSnapshot + nested (Chair, Secretary, Participant, WorkflowFlags, Member, Counterparty) + enums (MeetingType, VoteDecision, ParticipantRole, MemberRole, ExtractKind, ExtractSource) |
— | ✅ | 2026-04-18 |
| core — FeatureFlagProvider port | интерфейс в core.port |
адаптер в integration/common/featureflags (OpenFeature + Caffeine) |
🟡 (port ✅, adapter ⏸) | 2026-04-18 |
| protocol — ports | AgendaProvider, QuestionFileProvider, ExtractProvider, ExtractSynthesizer |
ProtocolEventsProvider, ProtocolStreamingProvider (Phase 5) |
🟡 | 2026-04-18 |
| app | Application, GlobalExceptionHandler (RFC 9457 ProblemDetail, pattern matching), миграции |
AsyncConfig (virtual threads), CacheConfig, JacksonConfig, SwaggerConfig, scheduler, audit | 🟡 Skeleton | 2026-04-18 |
| common-lib 3.4.0 | применено в локальном репо (см. checklist ниже) | см. Pending пункты ниже | ✅ baseline | 2026-04-17 |
| Checkstyle + тесты | — | Google Java Style, unit-тесты, Testcontainers | ⏸ | — |
Мапинг пунктов из
COMMON_LIB_REVIEW.mdв статус применения вobesrabuo-common-lib/3.4.0. Точный статус — см. самCOMMON_LIB_REVIEW.md(колонка Status).
| ID | Что | Status |
|---|---|---|
| C-1 | DocumentInsertProcessor — молчаливые ошибки | Applied in 3.4.0 |
| H-1 | Двойная нормализация шрифтов (фикс на стороне protocol-service) | Pending (protocol-service) |
| H-2 | StamperDocumentEngine — контекст в ошибках | Verify |
| M-1 | TEMPLATE_CACHE — добавить clearCache() для тестов | Verify |
| M-2 | copyMediaRelationships — уровень лога | Verify |
| ECM-C1 | Upload возвращает пустой DTO | Applied in 3.4.0 (Resilience4j) |
| ECM-C2 | Merge пропускает файлы при ошибке (фикс в protocol-service) | Pending (protocol-service) |
| ECM-H1 | 404 в retryable | Applied in 3.4.0 (Resilience4j) |
| ECM-H2 | Пустой body → Optional.empty() | Applied in 3.4.0 (Resilience4j) |
| ECM-H3 | Delete — молчаливые ошибки | Verify |
| ECM-M1 | Нет timeout на readAllBytes | Verify |
| ECM-M2 | Batch delete — неинформативный лог | Verify |
| ECM-M3 | Semaphore хардкод | Verify |
"Verify" = нужно открыть
obesrabuo-common-lib/и свериться с изменениями в 3.4.0. Задача до первого использования соответствующей функциональности в protocol-service.
Реализация портов, которые объявлены в protocol/port/ и core/port/. После ecosystem-разведки 2026-04-18 состав изменился — см. journal/phase-99-meta/2026-04-18-ecosystem-discovery.md.
modules/integration/
├── agenda/ — OBESRABUO_agenda (V2 API)
│ ├── AgendaFeignClient.java — Feign interface, V2 endpoints
│ ├── AgendaFeignAdapter.java — implements protocol.port.AgendaProvider
│ │ (loadSnapshot с StructuredTaskScope)
│ ├── AgendaMapper.java — ACL: AgendaFeignDto → Agenda (package-private)
│ └── dto/ — AgendaFeignDto, QuestionFeignDto, VoteFeignDto (records)
├── common/ — OBESRABUO_common (сервис!)
│ ├── events/
│ │ ├── CommonEventsFeignClient.java
│ │ ├── ProtocolEventsAdapter.java — implements ProtocolEventsProvider
│ │ └── dto/ — Event DTOs per type
│ ├── streaming/
│ │ ├── CommonStreamingFeignClient.java
│ │ └── ProtocolStreamingAdapter.java — implements ProtocolStreamingProvider
│ └── featureflags/
│ ├── CommonFeatureFlagFeignClient.java
│ ├── FeatureFlagAdapter.java — implements FeatureFlagProvider через OpenFeature
│ └── OpenFeatureConfig.java — provider + Caffeine TTL 60s
├── signature-storage/ — OBESRABUO Signature Storage
│ ├── SignatureStorageFeignClient.java
│ └── SignatureStorageAdapter.java
├── ecm/ — через obesrabuo-common-filestorage
│ └── EcmStorageAdapter.java
└── config/
└── FeignConfig.java
Объём: ~25-30 файлов.
Что изменилось vs исходный план (по результатам ecosystem-разведки):
integration/kafka/AuditEventProducer — события через common events API.integration/employee/EmployeeClient — V2 agenda уже обогащает ФИО/ролями.integration/common/ — отдельный пакет под 3 аспекта common-сервиса: events, streaming, feature-flags.OpenFeature SDK для feature-flags с Caffeine cache.Agenda не переписываем целиком, но добавляем endpoints под protocol 2.0 по мере необходимости. Заполняется в ходе реализации фаз 4-6.
| # | Что нужно agenda | Зачем | Статус |
|---|---|---|---|
| — | (пусто на старте) | заполнится по мере работы над AgendaFeignAdapter |
— |
Правила:
OBESRABUO_agenda. В этом репо отслеживаем только "что нам нужно".committeeCode: String в agenda остаётся, mapping на CommitteeType enum — у нас в ACL.NN-agenda-<что>.md с описанием "что стало у нас доступным".Без этого pipeline фаз 2-3 не работает.
modules/extract/
├── service/
│ ├── ExtractCrudService.java — CRUD выписок
│ ├── ExtractGenerator.java — генерация из DDCC
│ └── ExtractSpecifications.java — фильтры
├── report/
│ ├── ExtractReportStrategy.java — интерфейс с supports()
│ └── impl/
│ ├── DefaultExtractReport.java — по CommitteeType
│ ├── BankExtractReport.java
│ ├── SmbExtractReport.java
│ └── GoSmbExtractReport.java
└── template/
├── ExtractTemplateStrategy.java — выбор шаблона
└── impl/ (по CommitteeType)
Объём: ~20-25 файлов. Самый сложный модуль после protocol.
Ядро — оркестрация генерации протокола.
modules/protocol/
├── service/
│ ├── ProtocolGenerator.java — оркестратор 4 фаз
│ ├── ProtocolGenerationContext.java — record с данными между фазами
│ └── ProtocolAssembler.java — Phase 4: сборка финального документа
├── port/
│ ├── AgendaProvider.java — интерфейс (реализация в integration)
│ └── ExtractProvider.java — интерфейс (реализация в extract)
└── report/
├── ProtocolReportStrategy.java — интерфейс
└── impl/
├── DefaultProtocolReport.java — по CommitteeType
├── BankProtocolReport.java
├── SmbProtocolReport.java
└── GoSmbProtocolReport.java
Объём: ~15 файлов. Сложность в параллелизме (StructuredTaskScope) и координации фаз.
Template Method + конкретные стратегии.
modules/signature/
├── strategy/
│ ├── AbstractFileSignatureStrategy.java — Template Method
│ ├── impl/
│ │ ├── ExtractSignatureStrategy.java
│ │ ├── ProtocolSignatureStrategy.java
│ │ └── QuestionSignatureStrategy.java
│ └── (FileSignatureStrategy + Resolver — уже есть)
└── service/
├── SignatureService.java
└── SignatoryService.java
Объём: ~8-10 файлов.
modules/protocol/api/ → ProtocolController
modules/extract/api/ → ExtractController
modules/signature/api/ → SignatureController, SignatoryController
Объём: ~5-6 файлов. По сути маппинг URL → сервис.
modules/app/
├── config/
│ ├── AsyncConfig.java — virtual threads
│ ├── CacheConfig.java — Caffeine + Redis
│ ├── JacksonConfig.java — сериализация
│ └── SwaggerConfig.java — OpenAPI
└── (GlobalExceptionHandler — уже есть)
Объём: ~5 файлов.
1. Порты (AgendaProvider, ExtractProvider) — интерфейсы без реализации
2. ProtocolGenerationContext — record
3. ProtocolGenerator — оркестратор 4 фаз
4. ProtocolAssembler — Phase 4
5. Report strategies (protocol) — по CommitteeType
6. Integration module (Feign) — реализация портов
7. Extract module — генерация выписок
8. Signature (Template Method) — дозавершить
9. REST Controllers — маппинг API
10. App configs + Checkstyle + тесты — финализация
Шаги 1-5 можно делать без integration и extract — через интерфейсы-порты.
Это hexagonal architecture: бизнес-логика не зависит от внешних сервисов.