821 lines
41 KiB
Markdown
821 lines
41 KiB
Markdown
# Build 060.30 — Market Data Acquisition Final Documentation Architecture
|
||
|
||
**Статус:** Accepted
|
||
|
||
**Build:** 060.30
|
||
|
||
**Подсистема:** Market Data / Trades Feed (Time & Sales)
|
||
|
||
**Дата начала:** 2026-08-02
|
||
|
||
**Дата завершения:** 2026-08-03
|
||
|
||
**Версия документа:** 1.1
|
||
|
||
---
|
||
|
||
## Связанные документы
|
||
|
||
- [Текущая архитектура Trades Feed](../architecture/trades_feed.md)
|
||
- [Эксплуатация Trade Stream Runtime](../operations/trades_feed_runtime.md)
|
||
- [Целевая архитектура Dzentra](../architecture/dzentra_target_architecture.md)
|
||
- [Master Roadmap](../roadmap/master-roadmap.md)
|
||
- [Итог Build 060.29](build_060_29.md)
|
||
- [Итог Build 060.30](build_060_30.md)
|
||
|
||
---
|
||
|
||
## 1. Назначение
|
||
|
||
Build 060.30 завершает ветку Trades Feed (Time & Sales) не новой
|
||
функциональностью, а согласованной документацией фактически
|
||
реализованной системы Builds 060.20–060.29.
|
||
|
||
Build должен дать три уровня документации:
|
||
|
||
1. одну текущую архитектурную страницу Trades Feed;
|
||
2. одно эксплуатационное руководство Production Runtime;
|
||
3. исторические Build-документы, сохраняющие принятые решения и
|
||
результаты проверок соответствующего этапа.
|
||
|
||
По умолчанию Build 060.30 не меняет Production Runtime, SQL-схему,
|
||
Storage, Access или Replay. Изменение поведения допускается только при
|
||
воспроизведённом эксплуатационном дефекте, после отдельного анализа и
|
||
явного согласования.
|
||
|
||
---
|
||
|
||
## 2. Статус подэтапов
|
||
|
||
| Подэтап | Название | Статус |
|
||
|---|---|---|
|
||
| 060.30.0 | Documentation Baseline | Accepted |
|
||
| 060.30.1 | As-Built Trades Feed Architecture | Accepted |
|
||
| 060.30.2 | Production Operations Guide | Accepted |
|
||
| 060.30.3 | Project Entry Documentation | Accepted |
|
||
| 060.30.4 | Target Architecture Alignment | Accepted |
|
||
| 060.30.5 | Navigation and Historical Normalization | Accepted |
|
||
| 060.30.6 | Documentation Integrity Gate | Accepted |
|
||
| 060.30.7 | Final Documentation Verification | Accepted |
|
||
| 060.30.8 | Closure | Accepted |
|
||
|
||
Все подэтапы 060.30.0–060.30.8 прошли формальный review и приняты.
|
||
Архитектурный документ имеет статус `Accepted`, итоговый report —
|
||
`Completed`; Build 060.30 закрыт 2026-08-03.
|
||
|
||
Перед 060.30.3 обязателен отдельный corrective gate **Docker Production
|
||
Safety Hardening**. ADR-060.30-008 реализован, прошёл формальный
|
||
read-only review и принят 2026-08-03.
|
||
|
||
---
|
||
|
||
## 3. Исходное состояние и инварианты
|
||
|
||
1. Builds 060.20–060.29 завершены и имеют итоговые отчёты.
|
||
2. Фактическое поведение определяют текущие production-код, SQL
|
||
migrations, settings и тесты.
|
||
3. Принятый Build architecture фиксирует решения своего этапа, но не
|
||
обязан быть текущей обзорной страницей всей подсистемы.
|
||
4. Исторический список `out of scope` старого Build не является
|
||
описанием текущих ограничений после выполнения следующих Builds.
|
||
5. Production vertical slice завершён для Trades.
|
||
6. Quotes и Candles имеют Canonical models, PostgreSQL repositories,
|
||
Historical Access и Replay contracts, но не подключены как
|
||
Production Runtime consumers.
|
||
7. Storage write-side, Persistent Checkpoint, Historical Access и Replay
|
||
сохраняют разные границы ответственности и lifecycle.
|
||
8. История доступна только за фактически сохранённый период. Initial
|
||
exchange backfill и completeness metadata не реализованы.
|
||
9. Retention запускается только явно; автоматического scheduler нет.
|
||
10. Replay является caller-owned Python API без Bootstrap wiring и
|
||
automatic startup.
|
||
11. Пользовательское изменение `.gitignore` не относится к Build 060.30.
|
||
12. Перестановка локальных commits Build 045/046 выполняется отдельной
|
||
операцией после завершения Build 060.30 и до будущего push.
|
||
13. ADR-060.30-008 ограничивает Docker context production allowlist,
|
||
использует file-backed secrets и hardened containers. Images,
|
||
собранные до этого исправления, остаются потенциально
|
||
скомпрометированными и не должны публиковаться.
|
||
|
||
---
|
||
|
||
## 4. Иерархия источников истины
|
||
|
||
Для текущего поведения используется следующий приоритет:
|
||
|
||
```text
|
||
production code + SQL migrations + tests + settings
|
||
↓
|
||
accepted current architecture + operations guide
|
||
↓
|
||
overview + project structure + target architecture + roadmap
|
||
```
|
||
|
||
Для исторического вопроса источником являются architecture и report
|
||
соответствующего Build. Старый report не имеет приоритета над текущей
|
||
as-built страницей при ответе на вопрос, как система работает сейчас.
|
||
|
||
Исторические evidence, test counts и первоначальный scope не
|
||
переписываются задним числом. Устаревшая будущая нумерация получает
|
||
краткое retrospective-уточнение.
|
||
|
||
---
|
||
|
||
## 5. Целевая структура документации
|
||
|
||
```text
|
||
README.md
|
||
↓
|
||
docs/architecture/trades_feed.md
|
||
├── фактическая архитектура и ownership
|
||
└── docs/operations/trades_feed_runtime.md
|
||
└── настройка, запуск, recovery и проверка
|
||
|
||
docs/migrations/build_060_20...build_060_30
|
||
└── исторические решения и verification evidence
|
||
|
||
docs/roadmap/master-roadmap.md
|
||
└── текущая последовательность и фактические статусы
|
||
```
|
||
|
||
Текущая архитектура не должна дублировать длинную историю исправлений.
|
||
Operations Guide не должен подменять архитектуру или обещать
|
||
неавтоматизированные функции.
|
||
|
||
---
|
||
|
||
## 6. Контракт текущей архитектуры Trades Feed
|
||
|
||
[Текущая архитектура Trades Feed](../architecture/trades_feed.md)
|
||
обязана фиксировать:
|
||
|
||
- точный scope Production Trades vertical slice;
|
||
- транспортную границу Dzengi и Canonical models;
|
||
- Live processing path;
|
||
- Startup Hydration и Startup Recovery;
|
||
- reconnect → subscription restore → Recovery → Live;
|
||
- единый Consistency state для Live и Recovery;
|
||
- durable write до продвижения checkpoint;
|
||
- Application, Runtime и task ownership;
|
||
- Scheduler, Supervisor и transport liveness;
|
||
- разделение Storage write-side, Historical Access и Replay;
|
||
- направление зависимостей между пакетами;
|
||
- доступный период истории;
|
||
- фактические ограничения Quotes, Candles, Retention и Replay.
|
||
|
||
На этой странице запрещено объявлять весь Market Data Acquisition
|
||
завершённым: production-завершён только Trades Feed.
|
||
|
||
---
|
||
|
||
## 7. Контракт Production Operations Guide
|
||
|
||
[Эксплуатационное руководство](../operations/trades_feed_runtime.md)
|
||
обязано содержать:
|
||
|
||
- проверенные требования Python и PostgreSQL;
|
||
- local и Docker Compose способы запуска;
|
||
- полный список Trade Stream и Market Data Storage settings;
|
||
- обязательную зависимость
|
||
`MARKET_DATA_STORAGE_ENABLED=true → TRADE_STREAM_ENABLED=true`;
|
||
- `DB_HOST=localhost` для host-run и `DB_HOST=postgres` для Compose;
|
||
- startup и graceful shutdown sequence;
|
||
- фатальность ошибок включённого Runtime и persistent write;
|
||
- автоматический запуск migrations 1–9;
|
||
- предупреждение о блокирующей migration 9;
|
||
- backup, benchmark и maintenance window для большой базы;
|
||
- ручной характер Retention;
|
||
- caller-owned характер Historical Access и Replay;
|
||
- безопасные unit, integration, PostgreSQL, stress и live-команды;
|
||
- troubleshooting и границу полноты истории;
|
||
- запрет публикации credentials и production DSN.
|
||
|
||
Runbook обязан описывать hardened Docker baseline без преувеличения его
|
||
возможностей и отдельно предупреждать о старых images, собранных до
|
||
появления проверенного `.dockerignore`.
|
||
|
||
Версионная политика PostgreSQL закрыта следующей границей:
|
||
|
||
1. PostgreSQL 16.14 остаётся единственным поддерживаемым production
|
||
deployment baseline и закреплён в текущем hardened Compose.
|
||
2. Совместимость приложения с PostgreSQL 17.10 проверена изолированной
|
||
matrix 060.30.7 для migrations, repositories, checkpoint, Historical
|
||
Access, Replay и Trade Runtime integration.
|
||
3. Этот результат не является приёмкой hardened PostgreSQL 17 image,
|
||
Compose cutover или upgrade существующего volume. Такой production
|
||
переход требует отдельного infrastructure gate.
|
||
|
||
---
|
||
|
||
## 8. Scope подэтапов
|
||
|
||
### 060.30.0 — Documentation Baseline
|
||
|
||
- инвентаризация README, architecture, roadmap и Builds 060.20–060.29;
|
||
- фиксация источников истины;
|
||
- определение стабильных и исторических документов;
|
||
- фиксация текущих расхождений и границ Build;
|
||
- создание настоящего документа.
|
||
|
||
### 060.30.1 — As-Built Trades Feed Architecture
|
||
|
||
- создание `docs/architecture/trades_feed.md`;
|
||
- описание фактических Live, Recovery, Persistence, Checkpoint,
|
||
Historical Access и Replay boundaries;
|
||
- описание startup, reconnect и shutdown;
|
||
- фиксация Production scope только для Trades.
|
||
|
||
### 060.30.2 — Production Operations Guide
|
||
|
||
- создание `docs/operations/trades_feed_runtime.md`;
|
||
- проверка settings и feature flags по коду;
|
||
- описание host/Compose конфигурации PostgreSQL;
|
||
- описание migrations, Retention, Replay и verification procedures;
|
||
- фиксация временной PostgreSQL 16/17 policy до 060.30.7.
|
||
- фиксация Docker secret-in-image blocker без скрытого расширения scope.
|
||
|
||
### 060.30.3 — Project Entry Documentation
|
||
|
||
- обновление корневого `README.md` и `app/README.md`;
|
||
- обновление `overview.md` и `project_structure.md`;
|
||
- отделение общего/исторического `storage` foundation от
|
||
`market_data/storage`;
|
||
- замена устаревшего `app/src/storage/README.md`;
|
||
- согласование `.env.example` с фактическими settings;
|
||
- описание обычного developer workflow и обязательного Pyright gate;
|
||
- добавление понятной навигации к архитектуре и runbook.
|
||
|
||
### 060.30.4 — Target Architecture Alignment
|
||
|
||
- актуализация статусов 060.26–060.29;
|
||
- добавление Persistent Storage, Checkpoint, Access и Replay;
|
||
- исправление фактической схемы partitioning;
|
||
- фиксация 060.30 как текущего Build до его закрытия;
|
||
- актуализация Master Roadmap по фактическим статусам;
|
||
- сокращение исторического дублирования в Master Roadmap до ссылок.
|
||
|
||
### 060.30.5 — Navigation and Historical Normalization
|
||
|
||
- рабочие относительные Markdown-ссылки;
|
||
- retrospective-уточнения ошибочной будущей нумерации;
|
||
- единая семантика статусов architecture/report;
|
||
- явная маркировка исторических Stage roadmaps как архивных;
|
||
- сохранение исторических scope и evidence без широкого переписывания.
|
||
|
||
### 060.30.6 — Documentation Integrity Gate
|
||
|
||
- локальная проверка обязательных документов и относительных ссылок;
|
||
- запрет ссылок за пределы repository;
|
||
- включение gate в обычную offline regression;
|
||
- отсутствие сетевой зависимости и изменения Production Runtime.
|
||
|
||
### 060.30.7 — Final Documentation Verification
|
||
|
||
- Pyright `0 errors, 0 warnings`;
|
||
- full offline regression и `compileall`;
|
||
- `pip check` и `git diff --check`;
|
||
- проверка команд, env names и Compose configuration;
|
||
- PostgreSQL 17 application compatibility verification с явным
|
||
сохранением PostgreSQL 16.14 production baseline;
|
||
- отдельные read-only review архитектуры, runbook и полного diff.
|
||
|
||
### 060.30.8 — Closure
|
||
|
||
- создание `docs/migrations/build_060_30.md`;
|
||
- перевод всех подэтапов в `Accepted`, Build в `Completed`;
|
||
- перевод Master Roadmap на `060.30 Completed / 061.00 Planned`;
|
||
- подготовка точного staging-списка без `.gitignore`.
|
||
|
||
---
|
||
|
||
## 9. Политика исторических документов
|
||
|
||
Исторические Build-документы сохраняют:
|
||
|
||
- принятый на тот момент scope;
|
||
- архитектурные решения;
|
||
- результаты тестов;
|
||
- известные на тот момент ограничения.
|
||
|
||
В них допускаются только ограниченные корректировки:
|
||
|
||
- неверное имя или номер будущего Build;
|
||
- неработающая локальная ссылка;
|
||
- status metadata;
|
||
- trailing whitespace и окончание файла;
|
||
- краткое retrospective-пояснение, что downstream Build уже выполнен.
|
||
|
||
Запрещено заменять историческое описание новым состоянием системы или
|
||
пересчитывать старые verification results.
|
||
|
||
---
|
||
|
||
## 10. Политика языка, ссылок и секретов
|
||
|
||
1. Документация и комментарии проекта пишутся на русском языке.
|
||
2. Названия классов, методов, settings, протоколов и команд сохраняются
|
||
в исходном английском написании.
|
||
3. Навигация использует настоящие относительные Markdown-ссылки.
|
||
4. Backticks используются для идентификаторов, а не вместо ссылок.
|
||
5. В примерах запрещены настоящие токены, пароли, API secrets и
|
||
production DSN.
|
||
6. Команды с destructive test cleanup допускаются только для harness,
|
||
который проверяет loopback endpoint и имя базы `dzentra_test_*`.
|
||
|
||
---
|
||
|
||
## 11. Критерии приёмки 060.30.0–060.30.2
|
||
|
||
### 060.30.0
|
||
|
||
Подэтап может быть принят, если:
|
||
|
||
1. зафиксированы источники истины и границы Build;
|
||
2. перечислены все подэтапы 060.30;
|
||
3. определены три канонических документа;
|
||
4. Production-код, SQL и `.gitignore` не изменены;
|
||
5. исправление Git history явно оставлено отдельной операцией.
|
||
|
||
### 060.30.1
|
||
|
||
Подэтап может быть принят, если:
|
||
|
||
1. current architecture соответствует фактическому dependency graph;
|
||
2. Live и Recovery используют общий Consistency owner;
|
||
3. durable write и checkpoint описаны в правильном порядке;
|
||
4. startup, reconnect и shutdown соответствуют production-коду;
|
||
5. Access и Replay не представлены как часть automatic Runtime;
|
||
6. Quotes и Candles не названы production feeds;
|
||
7. все локальные ссылки разрешаются.
|
||
|
||
### 060.30.2
|
||
|
||
Подэтап может быть принят, если:
|
||
|
||
1. settings сверены с `config.py` и `.env.example`;
|
||
2. указано, что обычный Application startup требует PostgreSQL для
|
||
базовой схемы даже при выключенном Market Data Storage;
|
||
3. host/Compose DB addressing описан однозначно;
|
||
4. PostgreSQL 16/17 status не преувеличен;
|
||
5. migration 9 имеет backup/benchmark/maintenance warning;
|
||
6. Retention и Replay не названы автоматическими;
|
||
7. команды соответствуют pytest markers и safety harness;
|
||
8. документ не содержит секретов;
|
||
9. текущий Compose build не представлен как production-safe до появления
|
||
проверенного `.dockerignore` и согласованного hardening.
|
||
|
||
---
|
||
|
||
## 12. Критерии приёмки 060.30.3–060.30.8
|
||
|
||
### 060.30.3
|
||
|
||
1. README описывает запуск существующего checkout, а не генерацию нового.
|
||
2. Overview и Project Structure перечисляют фактические пакеты.
|
||
3. Общий/исторический `storage` и Canonical `market_data/storage`
|
||
разведены без ложного объявления всего `src.storage` устаревшим.
|
||
4. `.env.example` содержит все поддерживаемые settings без secrets.
|
||
5. Developer workflow включает requirements, Pyright и pytest markers.
|
||
6. Входные страницы ведут к current architecture и runbook.
|
||
|
||
### 060.30.4
|
||
|
||
1. Target Architecture содержит фактические результаты 060.26–060.29.
|
||
2. Физическое partitioning описано как отдельный parent/default table
|
||
каждого типа и явно создаваемые UTC-month partitions.
|
||
3. Master Roadmap показывает 060.30 текущим до его завершения.
|
||
4. Подробная историческая спецификация не дублируется в roadmap.
|
||
5. После closure следующий этап указан как 061.00.
|
||
|
||
### 060.30.5
|
||
|
||
1. Исправлена явно неверная downstream-нумерация Builds.
|
||
2. Architecture имеет статус `Accepted`, итоговый report — `Completed`.
|
||
3. Historical scope и test evidence сохранены.
|
||
4. Stage roadmaps явно обозначены как архивные.
|
||
5. Внутренние переходы являются настоящими Markdown-ссылками.
|
||
|
||
### 060.30.6
|
||
|
||
1. Link gate работает локально без сети.
|
||
2. Проверяются обязательные документы, отсутствующие targets и выход за
|
||
repository root.
|
||
3. Gate входит в default offline regression.
|
||
4. Production Runtime и SQL не меняются.
|
||
|
||
### 060.30.7
|
||
|
||
1. Pyright возвращает `0 errors, 0 warnings`.
|
||
2. Offline regression, `compileall` и `pip check` проходят.
|
||
3. Documentation link gate и `git diff --check` проходят.
|
||
4. Compose config проверен без раскрытия secrets.
|
||
5. PostgreSQL 17.10 application compatibility matrix проходит, а
|
||
PostgreSQL 17 явно не включается в поддерживаемый deployment baseline.
|
||
6. Независимые read-only review не содержат открытых findings.
|
||
|
||
### 060.30.8
|
||
|
||
1. Создан итоговый `build_060_30.md` без преждевременных claims.
|
||
2. Все подэтапы переведены в `Accepted`, Build — в `Completed`.
|
||
3. Master Roadmap переведён на `060.30 Completed / 061.00 Planned`.
|
||
4. Подготовлен точный staging-список без `.gitignore`.
|
||
5. Commit и push выполняются только по отдельному поручению.
|
||
|
||
---
|
||
|
||
## 13. Общие критерии закрытия Build
|
||
|
||
Build 060.30 может быть закрыт, если:
|
||
|
||
1. стабильные страницы согласованы между собой и с кодом;
|
||
2. README ведёт к текущей архитектуре и runbook;
|
||
3. Target Architecture и Master Roadmap имеют фактические статусы;
|
||
4. документационный static gate проходит без сети;
|
||
5. Pyright, offline regression, PostgreSQL verification и compileall
|
||
проходят;
|
||
6. `git diff --check` не содержит ошибок;
|
||
7. полный read-only review не содержит открытых findings;
|
||
8. итоговый report создан только после фактической приёмки;
|
||
9. `.gitignore` не входит в staging;
|
||
10. Docker secret-in-image blocker устранён либо Compose явно исключён из
|
||
поддерживаемых production deployment paths;
|
||
11. commit и push выполняются только по отдельному поручению.
|
||
|
||
---
|
||
|
||
## 14. Архитектурные решения
|
||
|
||
### ADR-060.30-001 — Current-state отделён от Build history
|
||
|
||
**Статус:** Accepted
|
||
|
||
Текущая архитектура описывается одной стабильной страницей, а Build
|
||
reports остаются историческими evidence.
|
||
|
||
### ADR-060.30-002 — Trades Feed имеет одну каноническую страницу
|
||
|
||
**Статус:** Accepted
|
||
|
||
Обзорные документы и README ссылаются на
|
||
`docs/architecture/trades_feed.md`, а не копируют подробности Runtime.
|
||
|
||
### ADR-060.30-003 — Operations имеют один канонический runbook
|
||
|
||
**Статус:** Accepted
|
||
|
||
Settings, startup, recovery, migrations и verification procedures
|
||
поддерживаются в `docs/operations/trades_feed_runtime.md`.
|
||
|
||
### ADR-060.30-004 — Исторические документы не переписываются широко
|
||
|
||
**Статус:** Accepted
|
||
|
||
060.30 исправляет навигацию и явно устаревшие метаданные, но сохраняет
|
||
исторические решения и результаты.
|
||
|
||
### ADR-060.30-005 — Documentation links получают static gate
|
||
|
||
**Статус:** Accepted
|
||
|
||
060.30.6 добавляет локальную проверку обязательных документов и
|
||
внутренних Markdown-ссылок.
|
||
|
||
### ADR-060.30-006 — Production behavior не меняется без дефекта
|
||
|
||
**Статус:** Accepted
|
||
|
||
Финальная документация не является основанием для скрытого изменения
|
||
Runtime или SQL. Реальный дефект анализируется и согласуется отдельно.
|
||
|
||
### ADR-060.30-007 — Git history repair отделён от Build 060.30
|
||
|
||
**Статус:** Accepted
|
||
|
||
Перестановка Build 045/046 и повторная проверка локальных commits
|
||
выполняются после фиксации 060.30, но до push, с backup ref и отдельным
|
||
разрешением.
|
||
|
||
### ADR-060.30-008 — Docker hardening обязателен до 060.30.3
|
||
|
||
**Статус решения:** Accepted
|
||
|
||
**Статус реализации:** Accepted (2026-08-03)
|
||
|
||
Утверждён отдельный corrective gate со следующими границами:
|
||
|
||
- корневой `.dockerignore` исключает secrets, `.venv`, caches, tests,
|
||
logs, data и локальные artifacts;
|
||
- Dockerfile копирует только production requirements и `app/src`,
|
||
использует закреплённый image, полный hash-lock и non-root user;
|
||
- Compose не содержит placeholder secrets, не публикует PostgreSQL
|
||
наружу по умолчанию и не создаёт бесконечный fatal crash loop;
|
||
- Compose требует явный project namespace; оператор обязан проверить
|
||
его уникальность, потому что повторное имя подключит существующие
|
||
named volumes этого namespace;
|
||
- production secrets поддерживают явный file-backed contract `*_FILE`
|
||
с fail-fast проверками конфликтов и пустых значений;
|
||
- container получает `no-new-privileges`, минимальные capabilities,
|
||
read-only filesystem, отдельный writable `/tmp` и явный shutdown
|
||
budget;
|
||
- PostgreSQL 16.14 остаётся единственным поддерживаемым production
|
||
deployment baseline; совместимость приложения с PostgreSQL 17.10
|
||
проверена отдельно, но production cutover требует нового gate;
|
||
- PostgreSQL bootstrap-admin отделён от непривилегированной application
|
||
role; role setup атомарен, а healthcheck отклоняет legacy superuser,
|
||
memberships и неверного owner;
|
||
- image использует `SIGINT`: до запуска Aiogram polling его принимает
|
||
`asyncio.run`, превращая остановку в cancellation с ожиданием уже
|
||
начатой blocking lifecycle operation;
|
||
- verification доказывает отсутствие `.env` и test secret во всех image
|
||
layers, non-root execution и clean Compose configuration;
|
||
- удаление старых images и rotation реальных credentials требуют
|
||
отдельного разрешения.
|
||
|
||
Corrective gate не меняет Trade Runtime, SQL или Market Data contracts.
|
||
|
||
---
|
||
|
||
## 15. План файлов
|
||
|
||
Новые файлы 060.30.0–060.30.2:
|
||
|
||
```text
|
||
docs/migrations/build_060_30_architecture.md
|
||
docs/architecture/trades_feed.md
|
||
docs/operations/trades_feed_runtime.md
|
||
```
|
||
|
||
Файлы corrective gate ADR-060.30-008:
|
||
|
||
```text
|
||
.dockerignore
|
||
app/.env.example
|
||
app/requirements.lock
|
||
app/src/core/config.py
|
||
app/tests/unit/core/test_config.py
|
||
app/tests/unit/infra/test_docker_hardening.py
|
||
infra/compose/docker-compose.yml
|
||
infra/compose/docker-compose.exchange-auth.yml
|
||
infra/docker/Dockerfile
|
||
infra/docker/postgres/Dockerfile
|
||
infra/docker/postgres/init-application-role.sh
|
||
infra/docker/postgres/healthcheck-application-role.sh
|
||
docs/migrations/build_060_30_architecture.md
|
||
docs/operations/trades_feed_runtime.md
|
||
```
|
||
|
||
Планируемые изменения следующих подэтапов:
|
||
|
||
```text
|
||
README.md
|
||
app/README.md
|
||
app/src/storage/README.md
|
||
docs/architecture/overview.md
|
||
docs/architecture/project_structure.md
|
||
docs/operations/trades_feed_runtime.md (точечная синхронизация)
|
||
docs/architecture/dzentra_target_architecture.md
|
||
docs/roadmap/master-roadmap.md
|
||
historical Build documents с точечными retrospective fixes
|
||
documentation integrity gate
|
||
```
|
||
|
||
Итоговый файл создаётся только в 060.30.8:
|
||
|
||
```text
|
||
docs/migrations/build_060_30.md
|
||
```
|
||
|
||
---
|
||
|
||
## 16. Вне scope
|
||
|
||
- изменение Trade Runtime, Storage, Access или Replay behavior;
|
||
- SQL migration 10;
|
||
- online replacement для migration 9;
|
||
- initial historical backfill;
|
||
- automatic Retention Scheduler;
|
||
- Production consumers Quotes и Candles;
|
||
- Replay Bootstrap или automatic startup;
|
||
- Backtesting, Analytics API и exchange simulator;
|
||
- новая Market Data feed;
|
||
- deployment, commit или push;
|
||
- изменение пользовательского `.gitignore`;
|
||
- переписывание Git history в составе документационного Build.
|
||
|
||
Исправление Docker security finding не входит в принятые
|
||
060.30.0–060.30.2. Оно реализовано отдельным corrective gate перед
|
||
060.30.3 и принято 2026-08-03. Deployment, удаление старых images и
|
||
rotation реальных credentials по-прежнему находятся вне scope.
|
||
|
||
---
|
||
|
||
## 17. Verification evidence
|
||
|
||
Проверки реализации 060.30.0–060.30.2 на 2026-08-02:
|
||
|
||
```text
|
||
Новые canonical documents: 3
|
||
Проверено относительных Markdown links: 41, clean
|
||
Ссылки за пределы repository: 0
|
||
Settings из config отражены в guide: 36/36
|
||
Лишние core settings в guide: 0
|
||
Синтаксис сложных shell recipes: clean
|
||
Whitespace новых файлов: clean
|
||
Production/SQL files changed: 0
|
||
Git index: empty
|
||
Постороннее изменение .gitignore: сохранено вне Build
|
||
```
|
||
|
||
Независимые read-only review архитектурного контракта, as-built страницы
|
||
и исправленного operations guide завершены без открытых findings.
|
||
Единственный P2 основной схемы исправлен и прошёл узкий повторный review.
|
||
060.30.0–060.30.2 приняты 2026-08-02.
|
||
|
||
Docker secret-in-image blocker зарегистрирован; отдельный hardening
|
||
contract реализован, прошёл отдельный приёмочный read-only review и
|
||
принят 2026-08-03.
|
||
|
||
Проверки реализации ADR-060.30-008:
|
||
|
||
```text
|
||
Target config/Docker tests: 73 passed
|
||
Pyright: 0 errors, 0 warnings
|
||
Full offline regression: 2723 passed, 95 deselected
|
||
Compose base + exchange override config: clean
|
||
Fail-fast обязательных Compose controls: 8/8 clean
|
||
Production dependency hash-lock: 25 packages, clean
|
||
Pinned bot/PostgreSQL image builds: clean
|
||
Image pip check: clean
|
||
Image layers: 9 checked
|
||
Project .env/.venv/tests/cache in layers: 0
|
||
Sentinel secret content in layers: 0
|
||
Container UID/GID: 10001:10001
|
||
Read-only root + dropped capabilities: clean
|
||
PostgreSQL isolated network/public ports: clean / 0
|
||
PostgreSQL application dangerous flags: 5/5 disabled
|
||
PostgreSQL owner + application DDL probe: clean
|
||
Normalized admin/application equality: rejected
|
||
Privileged-role healthcheck rejection: clean
|
||
PostgreSQL role membership rejection: clean
|
||
Atomic role-init rollback fault probe: clean
|
||
Cross-UID file-secret read probe: clean
|
||
Early-startup stop-signal probe: clean
|
||
Existing PostgreSQL 17 volume: detected, untouched
|
||
Controlled Docker cleanup: clean
|
||
```
|
||
|
||
Test-only Compose container, network, volumes, layer archives и
|
||
secret-файлы после проверки удалены. Старые локальные/registry images и
|
||
реальные credentials автоматически не удалялись и не менялись.
|
||
|
||
Проверки реализации 060.30.3 на 2026-08-03:
|
||
|
||
```text
|
||
Application settings в .env.example: 41/41
|
||
Относительные ссылки touched pages: 46, clean
|
||
Documented command paths: clean
|
||
LF / final newline / trailing whitespace: 8 files, clean
|
||
Target config/Docker tests: 73 passed
|
||
Pyright: 0 errors, 0 warnings
|
||
Full offline regression: 2723 passed, 95 deselected
|
||
Новые Production/SQL/Docker изменения: 0
|
||
Пользовательский .gitignore: сохранён вне scope
|
||
```
|
||
|
||
Первичный независимый architecture review обнаружил три P2 в описании
|
||
Quote/Candle scope, Bootstrap I/O и legacy import graph. Формулировки
|
||
исправлены; повторный review и два параллельных scope/settings review
|
||
завершены без открытых findings. 060.30.3 принят 2026-08-03.
|
||
|
||
Проверки реализации 060.30.4 на 2026-08-03:
|
||
|
||
```text
|
||
Итоговые reports 060.26–060.29: 4/4 Completed
|
||
Partitioned parent/default families: 3/3
|
||
Partition/Retention wiring в Bootstrap: отсутствует
|
||
Относительные ссылки touched pages: 24, clean
|
||
Stale-фразы предыдущей редакции: 0
|
||
Master Roadmap: 1751 -> 227 строк
|
||
Изменения отдельных Stage-roadmaps: 0
|
||
LF / final newline / trailing whitespace: clean
|
||
Git diff --check: clean
|
||
Pyright: 0 errors, 0 warnings
|
||
Full offline regression: 2723 passed, 95 deselected
|
||
Новые Production/SQL/Docker изменения: 0
|
||
Пользовательский .gitignore: сохранён вне scope
|
||
```
|
||
|
||
Три независимых read-only review обнаружили три уникальные P2:
|
||
преждевременное закрытие всего Market Data Acquisition в roadmap,
|
||
неверную гарантию межстраничного Historical snapshot и слишком узкий
|
||
UTC-only контракт Replay Clock. Формулировки исправлены; все три
|
||
повторных review завершены без открытых findings. 060.30.4 принят
|
||
2026-08-03.
|
||
|
||
Проверки реализации 060.30.5 на 2026-08-03:
|
||
|
||
```text
|
||
Architecture statuses 060.20–060.29: 11/11 Accepted
|
||
Final report statuses 060.20–060.29: 11/11 Completed
|
||
Retrospective notes: 9/9
|
||
Архивные Stage roadmaps: 7/7
|
||
Ссылки Master -> Stage: 7/7, clean
|
||
Ссылки Stage -> Master/Target: 14/14, clean
|
||
Relative links во всех docs: 229, broken 0
|
||
Документы scope 060.30.5: 34
|
||
CRLF / missing final newline: 0 / 0
|
||
Stage 08/09 files: 0
|
||
Git diff --check: clean
|
||
Новые Production/SQL/Docker изменения: 0
|
||
Пользовательский .gitignore: сохранён вне scope
|
||
```
|
||
|
||
Первичный acceptance review выявил два класса P2: неполную фактическую
|
||
цепочку в части retrospective-примечаний и оставшиеся некликабельные
|
||
переходы/списки связанных документов. Все девять примечаний приведены к
|
||
единой цепочке до 060.30 и ограничению будущей нумерации только 061.00;
|
||
навигация нормализована. Три повторных review завершены без открытых
|
||
findings. 060.30.5 принят 2026-08-03.
|
||
|
||
Проверки реализации 060.30.6 на 2026-08-03:
|
||
|
||
```text
|
||
Целевой documentation static: 331 passed
|
||
Полный static-набор: 332 passed
|
||
Documentation integrity gate: 365 documents, 252 links, 0 issues
|
||
Pyright: 0 errors, 0 warnings
|
||
Полная offline-регрессия: 3054 passed, 95 deselected
|
||
Git diff --check: clean
|
||
Новые Production Runtime / SQL изменения: 0 / 0
|
||
Пользовательский .gitignore: сохранён вне scope
|
||
```
|
||
|
||
Приёмочные read-only review отдельно проверили Markdown/CommonMark
|
||
precedence, безопасность URI и filesystem paths, переносимость Windows,
|
||
линейность обработки больших документов и wiring команд в README,
|
||
runbook, pytest и Pyright. Все воспроизведённые пограничные findings
|
||
исправлены с regression-тестами; повторные review завершены без открытых
|
||
замечаний. 060.30.6 и ADR-060.30-005 приняты 2026-08-03.
|
||
|
||
Выполненная verification matrix 060.30.7:
|
||
|
||
```text
|
||
Documentation integrity gate: 365 documents, 252 links, 0 issues
|
||
Полный static-набор: 332 passed
|
||
Pyright: 0 errors, 0 warnings
|
||
Dependency integrity: pip check clean
|
||
Compileall во временном cache: 618 files, clean
|
||
Полная offline-регрессия: 3054 passed, 95 deselected
|
||
Target config/Docker tests: 73 passed
|
||
Compose base + exchange-auth config: clean
|
||
Shell syntax затронутых scripts: clean
|
||
PostgreSQL application compatibility: 17.10 / 170010
|
||
PostgreSQL official image digest: sha256:8189a1f6e40904781fc9e2612687877791d21679866db58b1de996b31fc312e4
|
||
Application-role dangerous flags: 5/5 disabled
|
||
Полный PostgreSQL 17 integration: 90 passed
|
||
Критические PG17 race/restart repeats: 10 x 6 = 60 passed
|
||
Durable restart probe: preserved
|
||
Test-only container/network/volume/image: removed
|
||
Test-only secret files: removed
|
||
PostgreSQL 16.14 deployment baseline: unchanged
|
||
Существующие Docker resources: untouched
|
||
Git index: empty
|
||
Пользовательский .gitignore: сохранён вне scope
|
||
```
|
||
|
||
Предварительный review 060.30.7 обнаружил три P2: смешение application
|
||
compatibility с deployment acceptance, ложную гарантию уникальности
|
||
Compose namespace и backup-команду, привязанную к default database
|
||
settings. Границы и runbook исправлены без изменения Runtime, SQL или
|
||
Compose behavior.
|
||
|
||
Три финальных read-only review дополнительно обнаружили четыре P2:
|
||
устаревший current-status, небезопасный lifetime cleanup trap в
|
||
`compileall` recipe, ослабленную offline regression-команду и
|
||
неоднозначное расширение точного PostgreSQL 16.14 baseline до
|
||
произвольного PostgreSQL 16. Все findings исправлены; повторные
|
||
architecture, runbook/security и full-diff review завершены без открытых
|
||
замечаний. 060.30.7 принят 2026-08-03.
|
||
|
||
---
|
||
|
||
## 18. Итог
|
||
|
||
060.30.0–060.30.8 и corrective gate ADR-060.30-008 формально приняты.
|
||
Итоговый report создан; Build 060.30 имеет статус `Completed`.
|
||
|
||
Во время подготовки runbook был обнаружен pre-production finding:
|
||
прежний Docker context включал `app/.env`. ADR-060.30-008 исправил этот
|
||
дефект allowlist-контекстом, явным `COPY`, file-backed secrets,
|
||
non-root/read-only containers и закрытой database network.
|
||
|
||
PostgreSQL 16.14 остаётся единственным production deployment baseline.
|
||
PostgreSQL 17.10 проверен только как application compatibility target.
|
||
|
||
Следующий запланированный Build — 061.00 Validation and Canonicalization
|
||
Boundary Refactoring. Он не начат и требует отдельного read-only
|
||
архитектурного анализа.
|
||
|
||
Commit, аудит локальной Git history и push не входят в Closure и
|
||
выполняются только по отдельным поручениям.
|