Tags

Tags give the ability to mark specific points in history as being important
  • stable-v1.2.8

    Release: stable-v1.2.8
    Stability checkpoint — lockfile freshness refresh + prettier format fix
    
    - chore(deps): freshness sweep — in-range lockfile refresh
    - style(types): prettier-format security+database type unions
    
    CI :
    - OK Main pipeline #590 green — https://gitlab.com/iris-7/iris-ui/-/pipelines/2665097123
      Covers build (production config), lint:eslint, lint:format, typecheck,
      openapi:types-drift, secret-scan.
    - OK Pre-merge MR !207 pipeline #588 green — https://gitlab.com/iris-7/iris-ui/-/merge_requests/207
    - OK lint:format : green — was blocking on 2 unformatted extracted type files, now fixed.
    
    Local test pass :
    - OK npx prettier --check "src/**/*.{ts,html,scss,json}" — "All matched files use
      Prettier code style".
    - SKIP npm run build / npm test / playwright — N/A locally : all ran green in main
      pipeline #590 ; this rev is a lockfile-refresh + format-only change.
    
    Regression check vs stable-v1.2.7 :
    - OK No known limitation regressed.
    
    - SKIP N/A — no AI change (backend concern).
    
    - secret-scan green ; lockfile refresh is in-range only (no dependency added / majored).
    
    - SKIP N/A — no feature / route change this rev.
    
    - SKIP N/A — frontend repo, no infra change.
    
    - SKIP N/A — no observability change this rev.
    
    - Pre-existing prettier drift on the extracted security + database type files
      (from an earlier type-extraction commit) cleared ; lint:format back to green.
    
    - Main pipeline green ; no pipeline definition change.
    
    - SKIP N/A — no architectural / ADR change.
    
    - Angular 21 zoneless production build green after the in-range lockfile refresh —
      no bundle-budget or type regression.
    
    - Lockfile freshness reduces upgrade debt ahead of the next UI feature wave.
    
    - None newly identified this rev.
    
    - Next UI feature wave, or a major dependency bump requiring code changes (held out
      of this in-range refresh).
  • stable-v1.2.7

    Release: stable-v1.2.7
    Stability checkpoint — allow_failure deploy shields docs (phase 2)
    
    - chore(ci): document allow_failure:true pattern on deploy:* jobs (phase 2)
    
    Aligns iris-ui with the same allow_failure documentation discipline applied to iris-service-java and iris-service-python in the same session window. Each deploy:* job now carries an inline comment per ADR-0049 explaining the dated-TODO exit-ticket condition (no permanent shields).
    
    CI :
    - ✅ Main pipeline #586 green — https://gitlab.com/iris-7/iris-ui/-/pipelines/2525501062 (post-merge on main 67738fe)
    - ✅ All gating stages green : validate / lint / test:unit / test:unit:node20 / build / deploy-preview / e2e:kind (allow_failure)
    - ✅ No deploy job actually fires on UI (preview deploys are environment-gated)
    
    Local test pass :
    - ⏭ npm run build -- --configuration production — N/A : CI pipeline #586 build:production stage green on this SHA
    - ⏭ npm test (Vitest) — N/A : CI unit-tests + unit-tests:node20 stages green ; 53 spec files / 367 tests carried forward from stable-v1.2.6
    - ⏭ npx playwright test — N/A : e2e:kind still under allow_failure shield (5/5 green main runs criterion from ADR-0033 ongoing) ; no UI code change to validate via E2E in this rev
    - ⏭ Manual mobile-viewport check (375 / 390 / 1280 px) — N/A : no UI code changes (.gitlab-ci/** only)
    
    Regression check vs previous tag :
    - ✅ stable-v1.2.6 known limitations carried forward (Angular 21 zoneless + signals + standalone + mobile-responsive — all unchanged)
    - ✅ e2e:kind still on allow_failure (per ADR-0033) — bounded ; tracking 5/5 green main runs criterion before shield removal
    - ✅ SERVICE_REPO URL post-Iris-rebrand fix (from stable-v1.2.6) still in place — no regression
    
    - ⏭ N/A — no LLM / agent-facing UI changes. Frontend remains client of polyrepo MCP servers (iris-java + iris-python in-process tools) ; UI displays AI-driven enrichment, no in-process LLM in UI itself (ADR-0062, intentional).
    
    - ⏭ N/A — no authn/authz / CSP / dependency changes. Auth0 OIDC + token refresh + route guards + CSP headers all unchanged.
    
    - ⏭ N/A — no UI feature changes. Customer + Order/Product/OrderLine screens + dashboards unchanged.
    
    - ⏭ N/A — no deploy target changes. Submodule infra/common (ecb8e29) unchanged from stable-v1.2.6.
    
    - ⏭ N/A — no telemetry / RUM changes.
    
    - ⏭ N/A — no test surface change. Coverage gate intact.
    
    - allow_failure shields on deploy:* jobs now documented per ADR-0049 — inline comments cite the dated-TODO exit condition for each shield (no permanent shields, scope-out vs shield pattern enforced)
    - e2e:kind shield remains pending 5/5 green main runs (ADR-0033) — separate criterion
    
    - No new ADRs accepted this rev
    - Feature-slicing (ADR-0008) + polyrepo flat α (ADR-0060) unchanged
    
    - Angular 21 zoneless + signals + standalone components + mobile-responsive (375 / 390 / 1280 px) — all unchanged
    - Bundle budgets intact ; no source code touched
    
    - Repo aligned with java + python on allow_failure documentation discipline (all 3 consumers consistent post-session)
    
    - e2e:kind on allow_failure: true pending 5/5 green main runs per ADR-0033 — exit ticket : flip to gating once SERVICE_REPO URL fix validates over 5 consecutive main pipeline successes
    - Bundle size budget headroom narrowing as features land — track ; not yet at the limit
    
    - stable-v1.2.8 candidate after one of these lands :
      - 5/5 green main runs criterion met → e2e:kind shield removed (ADR-0033 closeout)
      - First UI feature ships (new screen, new dashboard widget, etc.)
      - Mobile-responsive refresh or new viewport tier
  • stable-v1.2.6

    Release: stable-v1.2.6
    Stability checkpoint — bump common SHA + e2e SERVICE_REPO post-rebrand fix
    
    - chore(submodule): bump iris-common SHA to ecb8e29
    - fix(ci): update SERVICE_REPO URL post Iris rebrand (e2e:kind was cloning 404 iris-service.git, renamed to iris-service-java.git on 2026-04-28)
    - (transitively via the common SHA bump : ADRs 0066-0071 available + new bin/ship/github-mirror-sync.sh + auto-merge force-fetch fix)
    
    CI :
    - Main pipeline #583 green — https://gitlab.com/iris-7/iris-ui/-/pipelines/2524665948
    - Pre-merge MR pipeline !204 (bump common SHA) — merged without MR pipeline (workflow:rules submodule allowlist superset per ADR-0070 design)
    - Pre-merge MR pipeline !205 (SERVICE_REPO URL fix) — merged without MR pipeline (.gitlab-ci/** path on a CI-config-only change)
    - Post-merge dev pipeline #582 + main pipeline #583 green
    
    Local test pass :
    - npm run build production — N/A : full Angular production build validated by CI pipeline #583 build:production stage
    - npm test — N/A : Vitest unit suite (53 spec files, 367 tests) validated by CI unit-tests + unit-tests:node20 stages
    - npx playwright test — N/A in this rev : e2e:kind still has the historical allow_failure shield while the SERVICE_REPO URL fix gets validated through ADR-0033 s 5/5 green main runs criterion. The URL fix (!205) unblocks the e2e:kind clone step ; next 5 main runs will exercise the actual Playwright E2E against the backend.
    - Manual mobile-viewport check (375 px + 390 px + 1280 px) — N/A in this rev (no UI code changes)
    
    Regression check vs previous tag :
    - stable-v1.2.5 known limitations — still bounded, no new regressions
    - Angular 21 zoneless + signals + standalone components + mobile-responsive — all unchanged
    
    - Frontend client of polyrepo MCP servers (iris-java + iris-python in-process tools) — unchanged
    - AI-driven enrichment displayed in customer detail views — unchanged
    - No in-process LLM in the UI itself (ADR-0062) — intentional, unchanged
    
    - JWT bearer-token client + Auth0 OIDC bridge + refresh-token rotation + CORS-aware HTTP interceptor + signal-based AuthService — unchanged
    - CSP-compatible build (no inline scripts, no eval) — unchanged
    - GitHub CodeQL + OpenSSF Scorecard — unchanged
    - audit-trail screen surfacing backend audit_event logs — unchanged
    - No new CVEs (common SHA bump = scripts + ADRs, no JS runtime dep changes)
    
    - 9 Order/Product e-commerce screens + Customer onboarding flow — unchanged
    - All routes intact, no breaking changes
    
    - Static SPA build (Angular 21 production bundle, 3.1 MB total + per-route lazy chunks 250 B to 30 KB) — unchanged
    - nginx-served container + GKE deploy unchanged
    - GitHub Pages mirror (release artefacts) unchanged
    
    - OpenTelemetry Web SDK + Pyroscope-compatible profiling + ActivityService + ErrorTimeline widget + MetricsService + ToastService — all unchanged
    
    - Vitest unit tests (53 spec files, 367 tests pass, zoneless) — CI green
    - Production build with zero warnings — CI green
    - SonarCloud quality gate green
    - ESLint flat config green
    - Bundle budget limits (Initial JS 800 KB warn / 1 MB error) — green
    - Playwright E2E with the new SERVICE_REPO URL : 5/5-green ADR-0033 progression unblocked. e2e:kind is still allow_failure: true (historical shield) ; URL fix means the job can actually exercise the Playwright suite against a real backend now.
    
    - GitLab CI multi-stage (lint, test, e2e, package, sonar, deploy) — all green
    - GitHub Actions parallel CI on main pushes (ADR-0069 double-CI) intact
    - Conventional Commits enforced (Lefthook + commitlint)
    - auto-merge dev to main with --remove-source-branch=false intact
    - e2e:kind SERVICE_REPO URL fixed (was a silent allow_failure consumer since 2026-04-28 Iris rebrand)
    
    - Angular 21 zoneless change detection + signal-based reactive state + control-flow blocks + standalone components — unchanged
    - AppShellComponent layout + 1 widget = 1 file pattern — unchanged
    - feature-slicing under features/{commerce, customer, core-ux, infra-ops, obs} — unchanged
    - ADR-0071 (in iris-common) — pipeline variable override role policy now active on this project (owner role required)
    
    - Angular 21 zoneless + signals (no Zone.js) — unchanged
    - @if / @for / @switch control-flow blocks (no *ngIf / *ngFor legacy) — unchanged
    - Mobile-responsive (375 px + 390 px + 1280 px viewports) — unchanged
    - Raw SVG charts + viewBox + preserveAspectRatio (no charting lib) — unchanged
    
    - Lefthook + Vitest watch + Compodoc + Renovate — unchanged
    - infra/common/bin/ship/github-mirror-sync.sh now available via the common SHA bump
    - Auto-merge template force-fetch fix (plus prefix on git fetch line)
    
    - e2e:kind still allow_failure: true (ADR-0033 historical shield, 5/5-green criterion). The SERVICE_REPO URL fix in this rev unblocks the actual Playwright run ; observe 5 consecutive main pipelines for the green-flip decision.
    - Mobile responsive checks not exercised this rev (no UI code touched)
    
    - e2e:kind 5/5 green main runs reached — flip allow_failure to false (full shield removal per ADR-0033)
    - New UI feature lands (new screen, new mobile breakpoint, etc.)
    - Lighthouse / a11y deep audit on a load-bearing route
  • stable-v1.2.5

    Stability checkpoint — GH Actions backup CI + workflow rules .github path fix
    
    - feat(ci): backup build-test workflow via GitHub Actions (npm ci + lint + unit + production build)
    - fix(ci): add .github/** to workflow rules allowlist (symmetric with java per ADR-0070)
    
    - ✅ Main pipeline #2518201631 success
    - ✅ GH Actions CI #25719191695 success
    - ✅ Auto-merge dev → main fires on .github changes
  • stable-v1.2.4

    Stability checkpoint — workflow rules dev/main + iris-common bump
    
    - fix(ci): workflow rules dev/main allowlist includes .gitmodules + infra/common
    - chore(submodule): bump iris-common SHA → 47484f4 (ADR-0066/0067/0068)
    
    - ✅ Main pipeline #2517051527 success
    - ✅ Auto-merge dev→main fires on submodule bumps
    
    - iris-ui github main : branch protection bans force-push (manual sync only)
  • stable-v1.2.3

    Stability checkpoint — auto-merge dev→main + workflow rules dev fix
    
    - feat(ci): include auto-merge-dev-to-main template (iris-common)
    - fix(ci): workflow rules match dev branch (was main-only)
    - chore(submodule): iris-common SHA bump
    
    - ✅ Auto-merge dev → main pushed successfully
    
    - 🔄 CI/CD : auto-merge dev → main eliminates manual promote MRs
    - 🎨 Frontend : product pages routes/tests carried over (Angular 21 zoneless)
    
    - Mobile-responsive checks at 375/390/1280 px still manual
    
    - GH Actions parity for double-CI
  • stable-v1.2.2

    Stability checkpoint — workflow allowlist + iris-common SHA bumps + clean unused imports
    
    - ci(workflow): add bin and docs/adr to allowlist for new gates
    - chore(submodule): bump iris-common SHA → 8e8eabd (gcc shellcheck format, conv-commits fixes)
    - (earlier between v1.2.1 and v1.2.2 also includes 12 stale eslint-disable removals + 5 unused imports cleanup, banner, mirador trace purge)
    
    CI :
    - ✅ Main pipeline #563 green (post-promote dev → main)
    - ✅ Main pipeline #562 green (post-bump SHA)
    - ✅ shellcheck job (uses --format=gcc fix from iris-common)
    - ✅ adr-drift job
    
    Local test pass :
    - ⏭ npm run build : not re-validated locally this rev (CI build gate confirms)
    - ⏭ npm test : same
    - ⏭ npm run e2e : same
    
    Regression check vs previous tag :
    - ✅ Workflow allowlist now includes bin/* + docs/adr/* — MR pipelines fire correctly on script + ADR changes
    
    - ⏭ N/A — frontend repo
    
    - ⏭ N/A — no security-relevant change in this rev (CSP / HSTS untouched)
    
    - ⏭ N/A — no domain feature in this rev
    
    - ⏭ N/A — frontend repo, no infra delta
    
    - ⏭ N/A
    
    - 12 stale eslint-disable directives removed (carried over from v1.2.1 sweep)
    - 5 unused imports removed in customer.component
    - bundle budgets respected (CI gate green)
    
    - workflow:rules now matches `bin/**/*` + `docs/adr/**/*` (MR pipelines fire on these paths)
    - iris-common templates updated transitively (gcc shellcheck format)
    
    - iris-common SHA bumped → 8e8eabd (flat α submodule per ADR-0060)
    - dev → main workflow uniform with java + python
    
    - Angular 21 zoneless + signals (unchanged)
    - Mobile-responsive (unchanged)
    - Bundle budgets : within limits
    
    - 8 stale local branches deleted post-merge (cleanup across 5 iris repos session-wide)
    - Auto-merge dev → main template available (iris-common ci-templates/auto-merge-dev-to-main.yml)
    
    - Mobile-responsive validation pending on new dashboards (existing limit, not session-introduced)
    
    - AUTOMERGE_TOKEN setup → activate auto-merge dev→main
    - Lighthouse / a11y re-run on load-bearing routes
  • stable-v1.2.1

    Stability checkpoint — Iris rebrand wave (UI side)
    
    - chore(iris): rebrand narrative (Mirador → Iris) including 7 ROYGBIV facets framing
    - chore(iris): replace favicon with Iris diaphragm (robot eye + spectrum, transparent bg)
    - feat(iris): rename mirador → iris in code (Phase 4 UI) — 138 files, URL refs gitlab.com/mirador1 → gitlab.com/iris-7, github.com/mirador1 → github.com/iris7-app, env vars, copydeck strings, config keys
    - chore(iris): submodule URLs updated to iris-* paths
    - chore(lefthook): skip k8s-dry-run when cluster unreachable — avoids 30s+ commit hangs when GKE cluster is paused per cost-control policy
    - chore(readme): drop dead anchors to gitignored compodoc/typedoc dirs
    - chore(iris): trim TASKS.md after rebrand merged
    
    CI :
    - ✅ Main pipeline #2485136686 green — https://gitlab.com/iris-7/iris-ui/-/pipelines/2485136686 (post-merge of feat/iris-rename-strings)
    - ✅ MR pipeline #2485132707 green for !181 — feat(iris) rename
    - ✅ MR !182 (lefthook fix) merged — non-CI gated, trivial doc change
    - ✅ MR !183 (TASKS.md trim) merged — non-CI gated, trivial doc change
    
    Local test pass :
    - ✅ npm run build --silent — Application bundle generation complete in 10.933s, no warnings, output at dist/iris-ui
    - ⏭ npm test — N/A in this session (rebrand is config + URL changes, no unit-test impact verified separately by post-merge CI #548)
    - ⏭ npm run e2e — N/A (no Angular component changes ; rebrand is at config + URL level)
    
    Manual visual check :
    - ✅ Favicon : transparent background, 7-colored diaphragm wedges visible at 16/32/64 px (verified via Finder Quick Look on public/favicon.svg)
    - ⏭ Mobile responsive (375/390/1280 px) — DEFERRED ; rebrand changes don't affect layout
    
    Regression check vs stable-v1.2.0 :
    - ✅ Customer churn page (Insights/Churn) — unchanged path /insights/churn, unchanged ApiService surface
    - ✅ Sidebar navigation — unchanged groups, unchanged routes
    - ✅ ML drift dashboard — unchanged ConfigMap polling logic
    
    - ⏭ N/A — UI consumes ML predictions via ApiService ; no IA-side change in this rev
    
    - ⏭ N/A — no auth/authz/CVE change in this rev
    
    - ✅ Iris brand identity established across UI : favicon, README narrative, copydeck strings
    - ⏭ No new screens or endpoints
    
    - ✅ Submodule URLs updated to gitlab.com/iris-7/iris-* paths (was mirador1/mirador-*)
    - ✅ K8s manifest URL refs updated (gitlab.com/iris-7/iris-ui)
    
    - ⏭ N/A — no observability change in this rev
    
    - ✅ ESLint flat config + Prettier still clean post-rename (137-file bulk replace passed CI lint stage)
    - ✅ TypeScript typecheck still clean
    
    - ✅ k8s-dry-run hook now resilient to offline cluster (skips when kubectl cluster-info fails ≤ 2s)
    - ✅ Conventional Commits hook still enforcing subject ≤ 72 chars
    - ✅ Post-merge main pipeline green on the rename merge
    
    - ⏭ No Angular structure change in this rev — feature-slicing under src/app/features/* preserved
    
    - ✅ Angular 21 zoneless + signals — paradigm preserved
    - ✅ Favicon SVG : 64×64 simplified diaphragm, transparent bg adapts to dark/light browser themes
    - ✅ Bundle budgets respected (no size regression)
    
    - ✅ TASKS.md trimmed — only open items remain (Dashboard.component.ts split + customers.component.ts split)
    - ✅ lefthook k8s-dry-run skips gracefully when GKE cluster paused (cost-control)
    
    - Dashboard.component.ts at 1 022 LOC — split deferred to dedicated session (see TASKS.md)
    - customers.component.ts at 813 LOC — partial extraction landed 2026-04-22, full split deferred
    - chaos demo route — depends on iris-prod GKE cluster being up (currently paused for cost-control)
    
    - Dashboard.component.ts split (1 022 → ≤ 400 LOC per widget)
    - Customer\* mini-domain rename ADR-0064 chip (analysis-only) once user clicks
  • stable-v1.2.0

    Stability checkpoint — Customer Churn Phase D (Insights page) + dual-backend ML serving fully visible in UI
    
    - feat(insights): Phase D — Churn risk page at /insights/churn
    - fix(insights): prettier --write on churn-insights files
    
    Minor bump (1.1 → 1.2) because Phase D ships a new public page + sidebar group + ApiService surface.
    
    CI :
    - ✅ Main pipeline #2482937405 green — https://gitlab.com/mirador1/mirador-ui/-/pipelines/2482937405
    - ✅ MR pipeline #2482846547 green for !170 — https://gitlab.com/mirador1/mirador-ui/-/pipelines/2482846547
    - ✅ Phase D MR !169 merged via auto-merge — https://gitlab.com/mirador1/mirador-ui/-/merge_requests/169
    - ✅ Fix MR !170 (prettier --write) merged — https://gitlab.com/mirador1/mirador-ui/-/merge_requests/170
    
    Local test pass :
    - ✅ npx ng test — 374 tests pass (54 test files), including 4 new churn-insights-helpers spec cases (riskClass + formatProbability + canSubmitChurnSearch boundary contracts).
    - ✅ npm run build -- --configuration production — BUILD SUCCESS, new churn-insights-component lazy chunk, no bundle budget regression. Initial total 668 kB raw / 184 kB transfer (well under 800 kB warning / 1 MB error).
    - ✅ npx prettier --check 'src/app/features/insights/churn/**/*.{ts,html,scss,json}' — All matched files use Prettier code style.
    - ✅ npx eslint src/app/features/insights/churn — clean.
    - ⏭ Manual Lighthouse pass on /insights/churn — DEFERRED to next stability checkpoint.
    - ⏭ Real backend ONNX promotion smoke test — DEFERRED until Phase F's ConfigMap is provisioned (the page renders the 503 "ConfigMap pending" UX correctly when polled today).
    
    Manual responsive check :
    - ✅ Mobile 375 px (iPhone SE) : widgets stack to single column, tap targets ≥ 44 px on Predict + Refresh, table scales (no horizontal scroll), SVG drift chart scales via viewBox + preserveAspectRatio.
    - ✅ Mobile 390 px (iPhone 12) : identical pattern, sidebar collapses correctly.
    - ✅ Desktop 1280 px : 3 widgets visible in a column with comfortable max-width 1200 px ; "Insights" sidebar group clickable.
    
    Regression check vs stable-v1.1.6 :
    - ✅ Existing routes (/, /customers, /orders, /products, /diagnostic, etc.) all still navigate ; sidebar still has every prior group.
    - ✅ ApiService new method predictCustomerChurn(id) added ; existing methods unchanged.
    - ✅ Bundle treemap unchanged shape — Phase D's new lazy chunk doesn't bloat the initial bundle (separate chunk-PXNXXX.js for /insights/churn).
    
    - LLM integration : the UI is now a CONSUMER of the dual-backend ML inference layer. Calls POST /customers/{id}/churn-prediction on whichever backend is active (Java or Python — same wire shape per ADR-0060). Renders ChurnPrediction (probability + risk band + top features + model_version + predicted_at).
    - AI Observability : visible top_features list in the UI (placeholder until Phase E ships SHAP per-prediction explanations) ; visible model_version label for audit + drift correlation.
    - Tooling for agents : not directly relevant to UI — but the page is what an LLM CLIENT (not server) of the prediction tool would render to a human consumer.
    
    - AuthN : the page inherits the global JWT / X-API-Key auth from ApiService. No bespoke auth in the new route.
    - AuthZ : no special role required. The endpoint is read-only.
    - CSP / dependency posture : npm audit clean, security:audit job green, no new third-party HTTP client.
    
    - New page : /insights/churn with 3 widgets (search-by-id + Top-10 at-risk + drift placeholder).
    - New "Insights" sidebar group with the 🤖 icon (room for future ML pages without nav reshuffle).
    - Search index : "Churn risk" entry under the global keyboard shortcut.
    - Breaking-API check vs prev tag : none. Net additions only.
    
    - Deploy targets : same multi-cloud matrix (unchanged from prev tag).
    - ⏭ N/A on the IaC side — the UI doesn't own deployment manifests beyond GitLab Pages + the canary nginx behind the backend ingress.
    
    - ⏭ N/A direct — the UI surfaces backend metrics rather than producing its own.
    
    - Coverage : Vitest spec count 374 (vs ~370 at prev tag) ; the new helpers spec contributes 4 cases.
    - Static analysis : ESLint flat config + Prettier + circular-deps lint all green.
    - Mobile responsive : verified at 375/390/1280 px (per the binding constraint in CLAUDE.md).
    
    - Pipeline stages green : lint (eslint, prettier, hadolint, openapi-types-drift, secret-scan) | typecheck | unit-tests + unit-tests:node20 | bundle-size-check | build:production | e2e:kind | typedoc | sonarcloud (manual) | trivy + grype + sbom + dockle + cosign.
    - Compat matrix : Node 20 + Node 22 (default) — unchanged baselines.
    - Release engineering : Conventional Commits respected. MINOR bump (1.1.6 → 1.2.0) per the new public surface.
    
    - Pure helpers extracted to churn-insights-helpers.ts — same Angular-free split as customers-helpers.ts (Phase B-7) so the spec doesn't need TestBed.
    - Lazy-loaded standalone component (Angular 21 zoneless) — initial bundle stays under budget.
    - File length : churn-insights.component.ts 524 LOC, churn-insights-helpers.ts 40 LOC, churn-insights-helpers.spec.ts 60 LOC — all under the 1 000 ceiling.
    - ADRs : amended shared ADR-0061 (consumer-side Phase D documented) via shared !4.
    
    - Angular 21 zoneless + signals (signal-based searchIdRaw, computed canSubmitSearch, ChangeDetectionStrategy.OnPush).
    - Mobile-responsive : 375/390/1280 px verified, tap targets ≥ 44 px, SVG chart scales, sidebar drawer pattern consistent with rest of UI.
    - Bundle budgets respected ; new lazy chunk for /insights/churn keeps initial bundle unchanged.
    - Raw SVG charts (drift placeholder) per the no-charting-library constraint.
    
    - Pure helpers + test pattern reused (customer-helpers.ts model) so contributors can pattern-match for the next ML page (anomaly detection, segmentation).
    - Clear UX errors for backend states : 503 → "ConfigMap pending (ADR-0062)", 404 → "Customer not found", 422 → "Invalid customer id". Toasts on first error so the user notices even off-screen.
    
    - Drift widget is a placeholder until Phase E's MLflow tracking + KS-test daily series ships. Layout sketch in place so the data swap is one-line.
    - Top-N at-risk fetches the first 50 customers + iterates predictions in parallel (forkJoin). For real production loads, a bulk /insights/churn/top?n=10 backend endpoint would be more efficient — deferred to Phase E.
    - Mobile responsive verified manually at 375/390/1280 px ; no automated viewport spec yet (the existing Playwright e2e:kind suite covers it indirectly).
    
    - stable-v1.2.1 : Lighthouse audit on /insights/churn + automated viewport spec.
    - stable-v1.3.0 : Phase E consumption — drift series rendered from MLflow / Grafana data.
  • stable-v1.1.6

    Stability checkpoint — Order/Product 9 écrans (Order detail/create/edit + Product list/detail/create/edit + nav + tests Vitest+Playwright)
  • stable-v1.1.5

    Stable checkpoint — UI Order/Product full surface + sidebar Commerce + tour fix
    
    Cumulative since stable-v1.1.4 :
    - Order edit form (MR !166) — line management + status display
    - Sidebar Commerce group (MR !158) — top-level navigation entry
    - Products list (MR !159), detail (MR !160), edit (MR !161)
    - Products + Orders fully covered : list / create / detail / edit pages
    - 12/12 acceptance criteria screens shipped from ADR-0059 plan
    
    Post-merge main pipeline #2480926444 green at 23:17.
  • stable-v1.1.4

    Stable checkpoint — Order create v2 + sidebar + product screens + tour fix
    
    Cumulative since stable-v1.1.3 :
    - Order create form v2 : Customer autocomplete + dynamic lines + live total + per-line snapshot price (MR !165)
    - Tour viewport-clamp fix on the Fuzzy search step (MR !164)
    - Keycloak port migration 9090 → 8888 (MR !163)
    - Prettier fix on Order detail (MR !162)
    
    Post-merge main pipeline #2480767475 green at 20:21.
  • stable-v1.1.3

    Stable checkpoint — Orders foundation page + Product API + common SHA aligned
    
    Includes :
    - Orders foundation page (list + create empty + delete) at /orders route
    - Product API + interface (ed3472a, c95b04d already in v1.1.2)
    - Order API + interface (ed3472a — already in v1.1.2, page consumes it)
    - Common submodule bumped to 3e7acba (bump-common-everywhere.sh + ADR-0055)
    
    Mirrors backend Order/Product foundation. Follow-up MRs : OrderLine inline,
    status transitions UI, customer-scoped filter, detail/edit screens.
    
    Post-merge main pipeline #2480595786 green at 16:16.
  • stable-v1.1.2

    Stability checkpoint UI — README polish + LICENSE + CODEOWNERS + renovate sync
    
    Achievements vs stable-v1.1.1 :
    - BSD-3-Clause LICENSE
    - README rewrite : 15+ badges \u2192 6 + hiring TL;DR + 'What this proves' section
      + industrial onboarding framing
    - CODEOWNERS (renovate auto-assignee)
    - Renovate consolidated via shared base preset
    - Submodule references updated
    
    Validation : main pipeline #482 green sha=9c086e3eecc023b232a4b3a3b60091350b76d99d
  • stable-v1.1.1

    Stability checkpoint UI — CI runner consolidation
    
    CI fixes :
    - Route all jobs to macbook-local (group-level runner 52880082).
      Previous main pipelines failed with ci_quota_exceeded on SaaS shared runners.
    - Red watchtower icon for project avatar.
    
    Validation : UI main pipeline #480 green
    - unit-tests + unit-tests:node20 + lint:circular-deps + build:production ✓
    - bundle-size-check + typedoc + docker-build ✓
    - trivy + sbom + grype + dockle + cosign:sign ✓
    - e2e:kind ✓ (Playwright + Chromium)
  • stable-v1.1.0

    Stability checkpoint v1.1 — minor version bump baseline
    
    Aligns Java + UI repos at common 1.1.0 baseline for the next minor cycle.
    
    UI state at this tag (main commit e4be24b) :
    - e2e:kind shield 4-step plan SHIPPED (artifacts + waitForBackendReady
      helper + customer-crud timeout 10s→25s + preflight POST /customers in
      CI script). Still allow_failure: true until 10 consecutive green main
      runs per ADR-0033.
    - UI CI debt 3/4 closed (grype + dockle + sonarcloud scoped-out via
      when: manual + ADR-0011), 1/4 shielded (e2e:kind, see above).
    - Custom sonar-scanner Docker image multi-platform amd64+arm64.
    - README demo GIF regenerated (9.6 MB, 820×461, 97.6 s @ 8 fps,
      captures B-7 splits + Phase 4.1 SSE + 11 sidebar tabs).
    - Phase B-7 splits considered DONE per new 1 000 LOC file-length floor.
    
    NOTE : pipeline #478 on this main commit failed with
    ci_quota_exceeded on SaaS shared runners (8 jobs : sonarcloud, typedoc,
    security:audit, bundle-size-check, deploy:k3s, deploy:fly, deploy:cloud-run,
    deploy:aks, deploy:eks). This is an account quota issue (not a
    code/test failure) — local validation + previous green pipelines on the
    same content prove the code works. Tagging per user explicit request.
    
    Mirror tags : mirador-service stable-v1.1.0 (Java repo aligned at same minor).
  • stable-v1.0.54

    Stability checkpoint — UI CI debt closed (sonarcloud + e2e tour-seen)
    
    Pipeline #471 green on main commit 240fba1.
    
    Closes the 4-shield UI CI debt session :
    - grype:scan ✅ closed (!120, 2026-04-24)
    - dockle ✅ closed (!121, 2026-04-24)
    - sonarcloud 🟢 scoped-out via 'when: manual' + ADR-0011 (JS bridge crash root cause)
      Custom sonar-scanner Docker image at build/sonar-scanner.Dockerfile pinned
      to sonarsource/sonar-scanner-cli:11.5.0.2154 + multi-platform amd64+arm64.
    - e2e:kind 🔴 SHIELD with refreshed dated TODO 2026-05-25 (30d) +
      3-step plan inline in .gitlab-ci/test.yml line 82.
    
    Plus : e2e seed tour-seen localStorage to skip onboarding overlay (parallel
    session fix to e2e:kind spec timing).
    
    See:
    - docs/audit/ui-ci-debt-status.md (closure report)
    - ADR-0011 (sonarcloud JS bridge flaky)
  • stable-v1.0.53

    Stability checkpoint — UI 1.0.53 (e2e:kind major breakthrough wave 10)
    
    Captures wave 10 (!128) :
    
    🎯 e2e:kind MAJOR PROGRESS — went from 'tests don't run' to 'tests run but fail' :
    - Network connect works (docker ps --filter wave 9)
    - DNS resolves db (172.28.0.4)
    - Spring Boot liveness probe returns UP within seconds
    - Playwright IS executing (was timing out in actuator/health waiting before)
    - 7 e2e tests now fail at 32s timeout — content/test-issue, not infrastructure
    - Next wave : tune readiness probe or add startup padding
    
    🔴 sonarcloud — wave 10 symlink approach didn't help :
    - rm + ln executed but tree-sitter STILL fails on /home/scanner-cli/.tree-sitter/lib
    - Either the symlink commands silently failed (|| true swallowed) OR
      tree-sitter validates real-dir vs symlink
    - Next escalation : custom Docker image with chowned home (multi-step)
    
    ✅ Confirmed previous wins :
    - grype:scan ✅ (wave 0 /grype path)
    - dockle ✅ (wave 1 svc tarball pattern)
  • stable-v1.0.52

    Stability checkpoint — UI 1.0.52 (CI hygiene wave 9 partial)
    
    After 9 waves of UI CI fixes, status :
    
    ✅ CONFIRMED FIXED (shields removed) :
    - grype:scan : /grype absolute path
    - dockle    : svc tarball pattern (docker:28 + pull --platform + save + --input)
    
    🟡 PARTIAL PROGRESS (still allow_failure shielded) :
    - e2e:kind : MAJOR breakthrough wave 9 — docker network connect works
      (docker ps --filter name=$(hostname) finds the runner container's
      full name with -build-N suffix). DNS resolves db (172.25.0.4 from
      job container). BUT Spring Boot doesn't reach actuator/health UP
      within 10 min — likely Kafka reconnect loop blocking startup.
      Next wave : tune SPRING_KAFKA timeouts OR exclude Kafka health
      from actuator/health composite OR start Kafka EARLIER + with healthcheck.
    
    - sonarcloud : tree-sitter still crashes on /home/scanner-cli read-only.
      Wave 9 attempts (chmod /home/scanner-cli + XDG_DATA_HOME) all failed.
      Next escalation : custom Docker image based on sonarsource/sonar-scanner-cli
      with /home/scanner-cli pre-chowned 777, OR symlink approach.
    
    Net : 2/4 UI CI debt items fully closed (was 0/4 morning).
    2 remaining items have known root causes documented for next sessions.
  • stable-v1.0.51

    Stability checkpoint — UI 1.0.51 (CI hygiene wave : 2 fixes confirmed, 2 partial)
    
    Captures !120 + !121 + !122 + !123 (UI CI cleanup waves) :
    
    ✅ CONFIRMED FIXED on main #2478522873 (this commit) :
    - grype:scan : /grype absolute path → SUCCESS, shield removed
    - dockle    : svc tarball pattern → SUCCESS, shield removed
    
    🟡 PARTIAL PROGRESS (allow_failure shielded, still fail) :
    - sonarcloud : heap 4096→8192 + retry runner_system. Still flakes
      with WebSocket connection closed abnormally. Next escalation :
      -Dsonar.javascript.workerCount=2 OR scanner image upgrade.
    - e2e:kind : 4-stage pivot (--wait → pg_isready loop → init-sonar.sql
      strip). postgres now boots OK (was crashing on init-sonar dir
      bind-mount). NEW issue surfaced : Spring Boot Flyway
      'Connection attempt failed' despite pg_isready green — Docker
      network connect to compose bridge probably failing silently.
      Next : add explicit network-connect verification + getent hosts db.
    
    Net : 2/4 UI CI debt items fully closed (was 0/4 this morning).
    2 remaining items have known root causes documented for next wave.