Tags give the ability to mark specific points in history as being important
-
stable-v1.2.4
a8d82cfa · ·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
24e6c532 · ·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
8bb23514 · ·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
2d3e4652 · ·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
e3109efd · ·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
3602d04f · ·Stability checkpoint — Order/Product 9 écrans (Order detail/create/edit + Product list/detail/create/edit + nav + tests Vitest+Playwright)
-
stable-v1.1.5
e7aa6f0a · ·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
68ffaf5a · ·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
4025af5d · ·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
9c086e3e · ·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
a51a3849 · ·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
e4be24be · ·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
240fba1e · ·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
9aa67f22 · ·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
a6243e5b · ·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
0b98ab7b · ·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.
-
stable-v1.0.50
e8e22afd · ·Stability checkpoint — UI 1.0.50 (B-7-7b database data extraction) database.component.ts 522 → 128 LOC (-75%) via 2 sibling data files : - database-health-checks.ts (156 LOC, 8 HEALTH_CHECKS with evaluate() callbacks) - database-sql-presets.ts (321 LOC, 35 SQL_PRESET_CATEGORIES in 5 categories) Matches '1 widget = 1 fichier' rule from CLAUDE.md File length hygiene. Build 0 warnings, chunk database-component 46.62 kB unchanged. Post-merge main pipeline #2478105896 confirmed green on e8e22afd (4 allow_failure jobs dockle/grype/sonarcloud/e2e:kind pre-existing, tracked separately as TASKS.md backlog item).
-
stable-v1.0.49
787fe402 · ·Stability checkpoint — D1 finale + root hygiene (MR !117) Closes D1 customers split started in B-7-2b. 4 dedicated services : - CustomerImportExportService (step 1) - CustomerSelectionService (step 2) - CustomerCrudService (step 3) - CustomerListStateService (step 4, this tag) customers.component.ts : 838 → 457 LOC (-46 % cumulative). 4 services = 670 LOC bounded, each one concern, all @Injectable providedIn:'root'. Only aggregate + detail panel + create remain in parent — different concerns each with their own reason to change. Plus root hygiene : eslint.config.mjs moved to config/ with CI + npm scripts updated. UI root file count 16 → 15 (cap met per CLAUDE.md 'Root file hygiene').
-
stable-v1.0.48
9c4004d4 · ·Stability checkpoint — customers split D1 steps 2+3 (MR !116) Completes the CustomerStateService split started with ImportExportService. Two more bounded services extracted : 1. CustomerSelectionService (B-7-2c step 2) — batch select + batch delete. Owns selectedIds (Set<number>) + selectAll + hasSelection + confirmBatchDelete + batchDeleteLoading signals. 5 methods : toggleSelectAll(pageContent) / toggleSelectOne(id) / openBatchDelete / cancelBatchDelete / executeBatchDelete(cb). Clear separation from other customer concerns. 2. CustomerCrudService (B-7-2c step 3) — single-customer edit + delete + random-create. Owns editingCustomer + editName + editEmail + editLoading + editError + deletingCustomer + deleteLoading + randomCreate* signals. 7 methods : openEdit/cancelEdit/saveEdit/openDelete/cancelDelete/ confirmDelete/addRandomCustomer (each with onAfterChange callback for list reload). Shared httpError() helper hoisted from customers.component.ts to customers-helpers.ts so the 4 call sites (component + 3 services) share one implementation. Counts (cumulative from B-7-2b baseline) : - customers.component.ts : 838 → 573 LOC (-32 %) - 3 new services : 187 + 127 + 163 = 477 LOC bounded, each one concern, each Injectable{providedIn:'root'} for Angular DI Template bindings routed through `selection.*` and `crud.*` via bulk sed — 11 references updated atomically. Remaining customers complexity : list pagination + sort + search + apiVersion + summaryMode + detail panel + aggregate. These are more intertwined (shared customers() signal + load() calls from many paths) — deferred to future session whether a full CustomerListStateService gives enough boundary value vs leaving the component at ~580 LOC. -
stable-v1.0.47
0858479e · ·Stability checkpoint — B-7-6/B-7-7 + customers D1 step 1 (MR !115) Three extractions batched in one MR per 'Réduire les vagues CI' rule : 1. Diagnostic B-7-6 : DiagnosticScenarioComponent generic widget used by 5 of 10 uniform-output scenarios (API Versioning, Idempotency, Rate Limiting, Kafka Enrich, VT Aggregate). Content projection slots for action + desc. 5 custom-output scenarios (Diff, Stress, Sched, Waterfall, Sankey) stay inline. html : 433 → 381 LOC. 2. Database B-7-7 : DatabaseHealthTabComponent extracted — owns its health-checks state + vacuum state + injections. Parent keeps healthChecks[] data array + passes as input. Cross-widget 'See raw data' dependency via single-hop event drilling through parent (no DatabaseStateService needed for one event). html : 237 → 141 LOC. 3. Customers B-7-2c step 1 : CustomerImportExportService extracted. Self-contained bounded service (no overlap with list/detail/ selection state) — owns importLoading/importProgress/importTotal/ importResults signals + handleFileSelected/exportJson/exportCsv methods. Component delegates via 3 thin wrappers. customers.ts : 838 → 715 LOC. Remaining customers split (list + detail + selection state) deferred — needs full CustomerStateService rewrite + signal-bridge widgets, 2-3h focused session.