v1.1.0 — Approval Workflow v2 (P0–P4) + CEO v1 plan polish

13 commits since v1.0.9. Two parallel work streams:

Track A — Approval Workflow v2 epic (8 commits, e438c4c → 361f3b4):
- P0: schema (record_drafts table, EXCLUDE constraint, approval_required
  column на dictionary_definitions). Migrations 0019 + 0020.
- P1: full lifecycle (submit/approve/reject/withdraw) + approval gate
  на CRUD (409 draft_required), validate-on-approve через bypass methods.
- P2: admin UI /reviews route — queue table + diff drawer (current vs
  proposed JSON) + approve/reject actions. Toggle approval_required
  в DictionaryEditorDialog.
- P3: e2e suite (8 cases) + bundle-driven soak gate (manifest 1.3.1
  flags spacecraft/ground_station, helm bundleHonorApprovalPolicy
  default false, staging override true). Phase 3 e2e exposed Phase 0
  enum case bug — fixed via migration 0020 + SQLSTATE 23P01-only
  mapping в DraftService.submit (perевыключили generic catch-all).
- P4 monitoring: 4 Micrometer metrics (pending_total Gauge, submit_total
  + decision_total Counters, review_duration_seconds Timer) + 4
  Prometheus alerts (QueueDeep, ReviewLatencyHigh, RejectionRateHigh,
  SubmitErrors) + runbook + UI pending-review badges + /my-drafts maker
  self-tracking + bulk approve/reject в /reviews.

Decisions (auto-applied per design doc):
- D1=A: per-dict policy через columns на dictionary_definitions.
- D2=A: legacy CRUD на approval-required dict → 409 draft_required.
- D3=A: pool model для reviewers (no assignment).
- D4=A: rejected drafts kept (compliance + maker visibility).

Track B — CEO v1 plan gap closures (5 commits, 5bc82d2 → 48df5ce):
- Webhook event preview tab — sample envelope JSONs для integrators.
- JMH benchmark module + manual CI job (parseRef ~20ns baseline).
- Per-dict Redis projection feature flag (Liquibase 0017) — cuts
  projection traffic 10x на cold dicts.
- Time-travel UI — ?at=ISO в records list, bookmarkable past states.
- Smart JSONB search (Liquibase 0018, pg_trgm + GIN) — cross-dict
  full-text search с per-dict caps (ROW_NUMBER PARTITION).

API surface added:
- POST/GET/DELETE /api/v1/dictionaries/{name}/records/drafts
- GET/POST /api/v1/drafts/{id} (+approve/reject)
- GET /api/v1/admin/reviews/pending — global queue
- GET /api/v1/drafts/me — maker self-tracking
- GET /api/v1/search?q&size&perDict

Migrations: 0017 (redis flag), 0018 (trgm search), 0019 (drafts +
approval cols), 0020 (status enum case fix).

Tests: 119 unit + 28 e2e + 89 vitest, helm staging+prod lint clean,
glab ci lint clean.

Lessons preserved в docs-internal/releases/v1.1.0.md:
1. Hibernate UPPERCASE enum vs lowercase check constraint mismatch.
2. Generic DataIntegrity catch-all anti-pattern hid the bug.
3. JDBC PreparedStatement '?' substitution gotcha в JSONB SQL.
4. mvn -P e2e обязателен для migration changes pre-push.
5. Bundle importer needs env-gate для policy changes.
6. Liquibase XSD ordering: preConditions → comment → operations.

Cluster ops после tag push:
- click trigger-deploy-prod в tag pipeline (либо glab api -X POST).
- decide approval rollout strategy: bundleHonorApprovalPolicy=true
  в values-prod, либо точечный per-dict UI flip.

Companion ordinis-infra commits: 28b9b93, bbd4f2a, a640339.

Detailed release notes: docs-internal/releases/v1.1.0.md.
