Files
mdm-ordinis/docs-internal/status/2026-05-12-state.md
T
2026-05-12 17:05:24 +00:00

185 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Состояние разработки Ordinis (ЦУОД ОДХ)
**Версия:** v2.14.0 (mega-sprint feature wave: 38 MRs за 2 дня, prod v2.8.0 → v2.14.0)
**Дата:** 2026-05-12 (vespertine update — конец дня 2)
**Owner:** zimin.an@nstart.space
**Окружения:**
- **prod** (cluster.264, https://ordinis.k8s.264.nstart.cloud, ✅ LIVE v2.14.0, Альтум traffic stable)
- **staging** (cluster.265, dev environment)
**Предыдущий snapshot:** [2026-05-07-state.md](./2026-05-07-state.md) (v1.0.1, post-cutover hardening)
---
## 0. Что изменилось с v1.0.1 (2026-05-07 → 2026-05-12)
### Mega-sprint feature wave
**День 1 (2026-05-11):** !108!140 = 33 MRs merged (28 features + 3 chores + 1 closed zombie + 1 v2.11.x deploy pending). Tags v2.0.0 → v2.11.0. Highlights: backend pending endpoints (5/5 + extras), schema workflow API (8 endpoints) + Phase 1a/b/c UI, History tab wiring, TimeTravelModal fully wired, Monaco editor, friendly error UI, webhook stats dashboard.
**День 2 (2026-05-12):** !141!147 = 7 MRs (5 merged + 2 design-only open). Tags v2.12.0 → v2.14.0. Focus shifted: feature shipping → polish + design proposals.
### День 2 detail (focus этого state.md)
**Polish features shipped:**
- **!141 → v2.12.0** RecordDrawer chip strip scroll-spy (IntersectionObserver active section highlight)
- **!142 → v2.13.0** Searchable MultiSelect через cmdk + DateRangePicker (react-day-picker, lazy chunk 67kb gz)
- **!143 → v2.14.0** Webhook delivery histogram (SVG stacked bar chart, 24h/7d toggle, hover tooltip)
**Design proposals (3 docs, не implementation):**
- **!143 + !144** Redis FK projection design v1 → v2.1 после 2 rounds /plan-eng-review. **NEAR-CLEAR.** Sprint estimate 8.5d → 4-5d после `LineageIndexService` reuse decision. 15-test plan + 3 critical safety mitigations + 3-tier kill switch + explicit SLO targets.
- **!145 + !146** AI schema assist design v1 → v2 после /office-hours. **Approach C-revised (hybrid template + per-field LLM)** chosen over v1 whole-schema LLM. 7B model на consumer GPU. P5 measurement step как prerequisite. 3-4d implementation.
- **!145 + !147** Dictionary marketplace design v1 → v2 после /office-hours + cross-model challenge. **Approach C-revised (bundle hygiene 2-3d hard cap)** chosen over v1 full marketplace (10-14d). Java handoff readiness + sales artifact angle. Anti-creep enforcement language.
**Prod deploy v2.14.0:**
- Pipeline 6700 (manual API trigger on tag)
- Bridge `trigger-deploy-prod` (id=30851) — played
- Downstream pipeline 6708 в ordinis-infra (project 368)
- Manual gate `deploy-prod` (id=30893) — played
- Helm rollout ~70s, no rollback
- Verified: `curl https://ordinis.k8s.264.nstart.cloud/api/v1/version``{tag: "v2.14.0", commit: "08c92627"}`
### 0.1. New design proposals (decision artifacts)
Все три ждут measurement / customer event / GPU availability перед implement:
| Design doc | Status | Effort | Prerequisite | Defer rationale |
|---|---|---|---|---|
| `docs-internal/design/redis-fk-projection.md` v2.1 | CLEAR | 4-5d | Dict упрётся в latency SLA | Premature optimization, текущий read path handles RPS |
| `docs-internal/design/ai-schema-assist.md` v2 | CHOSEN (Approach C) | 3-4d | Baseline measurement 2 weeks + GPU verification | Demand evidence пока ZERO — founder-driven feature |
| `docs-internal/design/dictionary-marketplace.md` v2 | CHOSEN (Bundle hygiene C-revised) | 2-3d hard cap | Customer #2 ETA + signing key infra decision | Bundle hygiene proceeds Q3, full marketplace ждёт N=2 customers |
**Design docs moved** из `docs/design/``docs-internal/design/` per /docs/ scope discipline (public docs = integrator + operator + reviewer only, no engineering internals).
`/office-hours` formal docs:
- `~/.gstack/projects/claude/zimin-main-design-ai-schema-assist-20260512.md`
- `~/.gstack/projects/claude/zimin-main-design-bundle-hygiene-20260512.md`
---
## 1. Стек / архитектура (без изменений с 2026-05-07)
Backend: Java 21 + Spring Boot 3.4.2 + JPA + Liquibase + PostgreSQL 18 + PostGIS + Kafka + Caffeine + Redis. Микросервисы: ordinis-app (writer), ordinis-read-api, ordinis-projection-writer, config-server. Outbox + Kafka publisher pattern, idempotency keys, audit log, valid_from/valid_to + EXCLUSION CONSTRAINT, data_scope filtering.
Frontend: React 19 + Vite 7 + TanStack Router + TanStack Query + Tailwind v4 + Radix primitives + cmdk + sonner toaster + @phosphor-icons/react + Monaco editor (lazy) + react-day-picker (lazy). Custom UI primitives только. @nstart/ui dropped (Stage 3.9).
Auth: Keycloak OIDC + JWT scope-based RBAC. `realm_access.roles` → DataScope (PUBLIC/INTERNAL/RESTRICTED). audience optional.
Infra: cluster.264 prod / cluster.265 staging. CNPG для PostgreSQL (single-instance, daily backups к S3 через geoportal-minio). Strimzi Kafka KRaft single broker. Vault (k8s auth). Redis для projection (per-dict opt-in feature flag).
---
## 2. Functional coverage matrix (updated)
### 2.1. UI features ✅ live на v2.14.0
| Feature | First shipped | Polish | Status |
|---|---|---|---|
| Schema workflow (draft → review → publish) UI | v2.5.0-v2.8.0 (Phase 1a/b/c) | — | ✅ live |
| TimeTravel modal (changes / records / schema tabs) | v2.10.0-v2.11.0 | — | ✅ live |
| History tab + Compare modal | v2.5.0 | — | ✅ live |
| Monaco editor для schema authoring | v2.8.0 | — | ✅ live |
| /reviews tabs (Записи / Схемы) | v2.8.0 | — | ✅ live |
| Friendly error UI (QueryErrorState, 10 sites) | v2.10.0 | — | ✅ live |
| Webhook stats cards (Pending/Retry/Delivered/DLQ + success rate) | v2.9.0 | — | ✅ live |
| Webhook stats histogram (SVG, 24h/7d) | v2.14.0 | — | ✅ live |
| RecordDrawer toolbar (search полей + только заполненные + scroll-spy chip strip) | v2.5.0-v2.12.0 | active section highlight | ✅ live |
| cmdk searchable MultiSelect (webhook events) | v2.13.0 | — | ✅ live |
| DateRangePicker (audit page) | v2.13.0 | — | ✅ live |
| Dark theme sweep (bg-white → bg-surface) | v2.6.0 | — | ✅ live |
| Mobile responsive (Sheet sidebar) | previously done | — | ✅ live |
### 2.2. Backend APIs ✅ live на v2.14.0
| Endpoint group | First shipped | Status |
|---|---|---|
| Dictionary CRUD + bitemporal records | v0.x | ✅ live |
| Schema workflow API (8 endpoints + audit) | v2.2.0 | ✅ live |
| Full timeline `/changelog` с kind discrimination | v2.3.x | ✅ live |
| Diff endpoint `/changelog/{entryId}/diff` | v2.4.0 | ✅ live |
| PATCH `/drafts/{id}` (edit без recreate) | v2.7.0 | ✅ live |
| Webhook subscriptions CRUD + DLQ + replay | v1.x | ✅ live |
| **Webhook stats `/subscriptions/{id}/stats?bucketBy=hour\|day`** | v2.14.0 | ✅ live (NEW) |
### 2.3. Что НЕ shipped (design only)
| Feature | Doc | Status | Blocker |
|---|---|---|---|
| Redis FK projection cascade invalidation | `docs/design/redis-fk-projection.md` v2.1 | CLEAR after 2 reviews | Dict latency SLA |
| AI schema assist (template + per-field LLM) | `docs/design/ai-schema-assist.md` v2 | Approach C chosen | P5 measurement + GPU |
| Bundle hygiene (manifest + publisher CLI, NO UI) | `docs/design/dictionary-marketplace.md` v2 | Approach C-revised chosen | Customer #2 ETA + signing key infra decision |
---
## 3. Backlog state (post-mega-sprint)
### 3.1. Active assignments (этой недели / следующих 2 weeks)
1. **P0 metric для AI schema baseline** — add `admin.schema_authoring.seconds` в `DictionaryDefinitionService.createDraft()`. Ship в v2.15.0 (~1h work). **Critical:** без этого нельзя decide P50 demand evidence для AI feature.
2. **2-weeks baseline collection** на v2.14.0 prod. После — decision: P50 > 20 min → implement AI schema assist Phase 1 (3-4d), P50 < 10 min → defer AI, ship bundle hygiene (2-3d).
3. **GPU verification** в k8s prod cluster (parallel с baseline collection). Talk to ops, confirm vLLM availability.
4. **Bundle signing key infrastructure decision** с corp ops (GitLab CI variables protected vs Vault vs HSM). Document choice.
5. **Customer #2 ETA confirm** — Альтум integration milestone, гидрометео preliminary discussion status. Informs marketplace urgency (не gates implementation though — bundle hygiene proceeds regardless).
### 3.2. Deferred (low priority)
| # | Item | Effort | Блокер |
|---|---|---|---|
| 1 | Phase 1d Keycloak roles в `useCanReviewSchema/Publish` | ~30 мин | infra не пробросила `realm_access.roles` в JWT |
| 2 | GitHub mirror sync (`git subtree split --prefix=ordinis-admin-ui`) | 1 мин | 2 weeks v2.14.0 stability observation |
| 3 | nsi-hot.md update v2.8.0 → v2.14.0 | 10 мин | low priority maintenance |
### 3.3. Roadmap (governance / data quality / federation, 2-3 quartals)
Без изменений с 2026-05-05-state.md:
- Approval workflow v2 (multi-step approval chain, BPM Camunda integration)
- Lineage / dependency graph
- Geo first-class (bbox/polygon query)
- Cross-dictionary FK cascade rules
- Data quality rules engine (cross-field constraints, ML-anomaly detection)
- Federation MDM-кластеров (master/replica)
- Schema registry (Apicurio/Confluent) для Kafka
- Webhooks для не-Kafka consumer'ов
---
## 4. Open risks (updated)
1. **Customer #2 acquisition velocity** — marketplace + AI assist designs assume timeline. Если customer #2 не появляется в Q3 — design docs sit, no rework needed но opportunity cost real.
2. **P5 measurement may invalidate AI assist hypothesis.** Baseline P50 < 10 min → 30мин «admin pain» субъективна, feature defer'нется. Cost = ~1h metric work, low risk.
3. **GPU availability в prod cluster** uncertain. Если нет — AI schema assist requires either: external API за feature flag (compromise data perimeter для non-classified), procurement new GPU node (delay weeks-months), or skip feature entirely.
4. **Bundle hygiene scope creep risk.** Hard cap 2-3 days с anti-creep enforcement language — but founder discipline ultimate enforcement. PR review rule: reject additions outside «what ships» list.
5. **CHANGELOG.md bundling в frontend** (v2.14.0 «Что нового» feature) — main bundle вырос 394kb → 427kb (+33kb / +13kb gz). CHANGELOG растёт ~500 bytes per release. Через 100 releases это ~50kb extra. Acceptable now, может потребовать lazy-load или backend endpoint в будущем.
---
## 5. Naming / branding state
- Repo: `ordinis` (was `nsi`)
- Product display: «Ordinis» английский / «Ордин» русский (rare)
- Customer #1: ЦУОД ОДХ (anchor)
- Bundle ID convention: `<domain>.<vertical>.<bundle-name>` (e.g. `ru.cuod.dzz-ground-segment`)
- Tag scheme: semver `vMAJOR.MINOR.PATCH`, auto-bumped via semantic-release
- Prod URL: https://ordinis.k8s.264.nstart.cloud
- Swagger: https://ordinis.k8s.264.nstart.cloud/swagger-ui.html
- Docs: https://ordinis.k8s.264.nstart.cloud/docs/ (mkdocs)
---
## 6. Workflow patterns (operational learnings, this session)
1. **GitLab deploy gate sequence:** trigger pipeline → play `trigger-deploy-prod` bridge → play downstream `deploy-prod` job. Three separate explicit confirmations.
2. **`GITLAB_HOST=git.nstart.cloud`** env var нужен для `glab api` calls (default goes к gitlab.com). `glab mr view` works without (uses git remote).
3. **Manual API pipeline trigger** для prod deploy (semantic-release bot pipelines skip CI). `glab api -X POST projects/367/pipeline?ref=v{TAG}`.
4. **Cross-model challenge** in /office-hours Phase 3.5 critical — каждый раз когда engaged surface'нул substantial issues missed by single-model reasoning. Marketplace session was strongest example: my pure-defer recommendation overcorrected, subagent caught 4 misses, final synthesis better than either pure position.
---
## Резюме
- **Prod v2.14.0 live** на cluster.264. 6 minor versions shipped в один день (v2.8.0 → v2.14.0). 38 MRs total за 2 дня.
- **Three design proposals documented** с explicit prerequisites + measurement steps + hard caps. None implementation. Defer recommendations stand.
- **Главный риск** для дальнейшего product development — не technical, а demand signal. AI assist / marketplace требуют customer pull или measurement evidence перед dev investment.
- **Next concrete action:** ship metric `admin.schema_authoring.seconds` в v2.15.0 (~1h work), затем 2 weeks observation.
**Прогноз до next major release decision (v3 vs v2.x):** ~2-4 weeks pending baseline measurement results + customer #2 conversation outcomes.