Tags give the ability to mark specific points in history as being important
-
stable-v1.2.22
51b2ea56 · ·Stability checkpoint — GitHub Actions backup CI (double-CI per ADR-0069) - feat(ci): backup build-test workflow via GitHub Actions (mvn verify + postgres service) - ✅ Main pipeline #2518082724 success - ✅ GH Actions run #25718233396 success (first live double-CI run) - ✅ Auto-merge dev→main fires on .github/** changes (workflow rules allowlist includes the path) - 🔄 CI/CD : Linux amd64 native backup gate via GH Actions (ubuntu-latest) - ✅ Qualité : independent failure domain from GitLab SaaS
-
stable-v1.2.21
02a7c7c5 · ·Stability checkpoint — workflow rules dev/main allowlist incl submodule paths + iris-common bump - fix(ci): workflow rules dev/main allowlist includes infra/common + .gitmodules + infra/shared (gitlink + glob paths) - chore(submodule): bump iris-common SHA → 47484f4 (ADR-0066/0067/0068) - ✅ Main pipeline #2517065262 success - ✅ Auto-merge dev→main now fires on submodule SHA bumps too (root cause for previous manual merges) - iris-ui github main rejects force-push (branch protection rule) - Java + python + ui parity on GH Actions for double-CI safety net
-
stable-v1.2.20
fafbdc9f · ·Stability checkpoint — auto-merge dev→main feature + 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) - test(order): OrderStatusTest enum sanity tests (recovered from feature/order-entity) - chore(submodule): iris-common SHA bump 8e8eabd → cf8c973 (gcc fix, conv-commits 100, skip merge commits) - ✅ Main pipeline post-merge green - ✅ Auto-merge dev → main fires correctly (allow_force_push + AUTOMERGE_TOKEN protected) - ✅ grype:scan 0 CVEs - ✅ All gates green (shellcheck, adr-drift, conv-commits, code-quality, sonar, integration-test, unit-test, docker-build, build-jar) - 🔄 CI/CD : 🆕 auto-merge dev → main template (eliminates manual promote MRs) - ✅ Qualité : OrderStatusTest enum sanity (carry-over from old branch, +1 file) - 🏛 Architecture : iris-common SHA bumped (template + script updates) - Compat matrix SB3/SB4 × Java17/21/25 still `manual` (regression baseline) - Compat matrix on scheduled cadence (daily/weekly) - GH Actions parity for double-CI
-
stable-v1.2.19
99d6a0a5 · ·Stability checkpoint — security (8 CVEs fixed) + iris-common SHA bumps + CI templates + dev workflow uniformised - fix(deps): bump spring-boot 4.0.5 → 4.0.6 (Critical GHSA-8v8j-3hxp-93wr + High GHSA-wwpq-f5c3-7hvx + spring-security 7.0.4→7.0.5 via BOM cascade with 2x High) - fix(deps): pin netty 4.2.13.Final + postgresql 42.7.11 (6 High CVEs across netty/codec, /codec-dns, /codec-http, /codec-http2 + GHSA-98qh-xjc8-98pq pgsql) - ci: include shellcheck + adr-drift universal templates from iris-common - chore(banner): per-repo banner with 7 ROYGBIV axes specific to repo content - chore(submodule): bump iris-common SHA → 8e8eabd (gcc shellcheck format, conv-commits skip merge commits, conv-commits 100-char limit) - build(pom): dedup maven-antrun-plugin + record PIT 91% on e-commerce - workflow:rules : add `infra/common` (gitlink) + `infra/shared` (gitlink) for submodule SHA bumps to trigger pipelines CI : - ✅ Main pipeline #2513437880 green (post-CVE-fix promote dev → main) - ✅ grype:scan : 0 CVEs (was 8 High/Critical pre-fix) - ✅ shellcheck (--format=gcc), adr-drift, conv-commits, code-quality, sonar-analysis, integration-test, unit-test, docker-build, build-jar - ✅ owasp-dependency-check + secret-scan Local test pass : - ⏭ ./mvnw verify -q : not re-validated this rev (CI gate confirms) - ⏭ ./mvnw verify -Dcompat -Djava21 : not run this rev (compat matrix manual) - ⏭ bin/dev/api-smoke.sh : not re-run Regression check vs previous tag : - ✅ All previous CVE-suppressions still valid in .grype.yaml (no false positive cascade from BOM bumps) - 🆕 SB 4.0.6 BOM brings spring-security 7.0.5 transitively — confirmed in dependency tree - ⏭ N/A — no AI/ML code change in this rev (existing Spring AI 1.1.4 + Ollama + 14 in-process MCP tools stay) - 8 CVEs resolved (was main-RED for 11+ days) : - spring-boot Critical GHSA-8v8j-3hxp-93wr - spring-boot High GHSA-wwpq-f5c3-7hvx - spring-security-config 2x High - netty 5x High (codec/dns/http/http2) - postgresql JDBC High GHSA-98qh-xjc8-98pq - grype:scan job : green - owasp-dependency-check : green - secret-scan : green - ⏭ N/A — no domain feature in this rev (CI/security focus) - ⏭ N/A — no infra delta in this rev - ⏭ N/A — no observability change in this rev (existing OTel + 3 SLOs + multi-burn-rate alerting stay) - JaCoCo gate : green - PIT mutations 91% e-commerce : passed - SonarCloud quality gate : green - ESLint flat config : green - Spectral OpenAPI lint : green - shellcheck + adr-drift + conv-commits universal templates from iris-common (auto-update on bump) - workflow:rules now matches `infra/common` + `infra/shared` gitlink (bump-only MRs trigger pipelines) - conv-commits 100-char limit (multi-package bump messages no longer rejected) - conv-commits skip merge commits (parent count > 1) - Compat matrix SB3/SB4 × Java17/21/25 : manual jobs available - iris-common SHA bumped → 8e8eabd (flat α submodule per ADR-0060) - 5 iris-7 repos uniformly use dev → main workflow - Hexagonal Lite (ADR-0044) + Feature-slicing (ADR-0008) preserved - ⏭ N/A — backend repo - 47 stale local branches deleted post-merge (cleanup across 5 iris repos session-wide) - Auto-merge dev → main template available in iris-common (ci-templates/auto-merge-dev-to-main.yml) — pending AUTOMERGE_TOKEN setup - 110 branches mergées cleaned across the 5 iris repos session-wide - netty 4.2.13.Final + postgresql 42.7.11 pinned via <properties> override — revert to BOM defaults once SB 4.0.7+ catches up - Compat matrix manual (SB3+J17/21/25) — not run this rev - AUTOMERGE_TOKEN setup → activate auto-merge dev→main on java - runner dind migration → re-enable python integration-tests gate
-
stable-v1.2.18-as-iris
0c25fcce · ·Stability checkpoint — Iris rebrand consolidation milestone (mirador → iris) This tag marks the polyrepo as fully stable under the Iris brand. The mirador→iris rename landed across all 5 repos, the 4 supporting TASKS.md files are cleared, the GCE quota constraint that surfaced during the 2026-04-29 cluster bring-up is now formalised + gated as a pre-flight, and 5 SLO dashboard screenshots prove the observability stack renders end-to-end on real backend traffic. - chore(tasks): delete TASKS.md — no open work - docs(slo): capture 5 dashboard screenshots from local lgtm stack - build(pom): align groupId com.example → org.iris (package namespace match) - docs(tasks): trim RPO section, measurement landed 2026-04-29 - fix(deploy): correct stale image path post-rebrand iris-service-java - test(api): cover OpenApiConfig coerceExample to 96% - docs(tasks): trim e-commerce items shipped via stable-v1.2.16/17 CI : - ✅ Main pipeline #2487256755 green (parent SHA d86fdb4, 5/5 auto jobs + 15 manual deploy targets) — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2487256755 - ✅ MR !279 (screenshots) pipeline #2487406275 green — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2487406275 - ✅ MR !278 (groupId align) pipeline #2487206841 green — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2487206841 Local 2026-04-29 (this session) : - ✅ Cluster bring-up + tear-down on GKE Autopilot iris-prod (verified terraform apply/destroy on the renamed module name — shared !20) - ✅ 5 SLO dashboard screenshots captured against local docker-compose lgtm stack (Grafana 12.4.2, otel-lgtm:0.25.0) with sustained 10 rps traffic. PNG artefacts at docs/audit/screenshots/2026-04-29/. Real data visible (Request rate 9 endpoints, 40% error burst at 07:28, JVM heap G1 Eden + Old Gen). - ⏭ ./mvnw verify N/A this session — relied on CI gate. The MR pipelines on parent commits exercised the full unit + integration + jacoco gate. Local verify last confirmed at stable-v1.2.17. - ⏭ ./mvnw verify -Dcompat -Djava21 N/A — compat matrix manual job available, not re-triggered for this checkpoint. Regression check vs stable-v1.2.17 : - ✅ JaCoCo bundle 0.92 + per-package gates still hold (no test removed, only OpenApiConfig coverage added). - ✅ groupId rename com.example → org.iris validated by Spring Boot context tests (no class-loading regression — !278 pipeline green). - 🆕 GCE SSD_TOTAL_GB quota constraint discovered + addressed (shared ADR-0065 + bin/budget/budget.sh quota pre-flight gate in shared !22). - Spring AI 1.1.4 + Ollama local LLM + 14 MCP @Tool methods (per-method instrumentation, ADR-0062). Wiring unchanged this rev ; verified by previous tag's MCP smoke (claude → list_recent_orders). - AI Observability : gen_ai.* OTel spans visible in Tempo (verified via the canary-rollout + golden-signals dashboards from this rev). - ⏭ N/A — no AI-layer change in this checkpoint. - AuthN flows verified at stable-v1.2.16 : JWT + X-API-Key + OAuth2/OIDC via Auth0 + refresh-token rotation. No regression this rev. - AuthZ : RBAC roles + @PreAuthorize on admin tools + per-endpoint matchers in SecurityConfig (99.0% coverage from stable-v1.2.17 holds). - CVE posture : grype + trivy + owasp-dependency-check all green on pipeline #2487256755 (sbom:syft, dockle, cosign sign + verify all ✅). - Headers + filters : CSP, HSTS, X-Frame-Options, rate-limit, idempotency filter, request-id correlation — unchanged. - Domain features end-to-end : Customer onboarding + Order/Product/ OrderLine domain (6 invariants, jqwik property tests, JaCoCo 100% on order/product packages from stable-v1.2.16). - 🆕 5 SLO dashboard screenshots prove the dashboards exist + render with real traffic (golden-signals 9 endpoints, canary stable-vs-canary, service-graph topology, churn-drift trend, slo-overview gauges). - No breaking-API change vs stable-v1.2.17. - 🆕 GKE Autopilot bring-up + tear-down verified end-to-end on the renamed cluster (iris7-prod → iris-prod, shared !20 merged). - 🆕 GCE SSD_TOTAL_GB quota constraint surfaced + addressed (shared ADR-0065 + budget.sh quota pre-flight gate via shared !22). - 🆕 up.sh + up-fast.sh patched to skip dangling argocd/application.yaml (pre-existing bug from ADR-0025 that died with set -e for missing file). - IaC : Terraform module rename to iris-prod is the canonical name now. - Cost discipline : SSD quota at 42/300 GB after tear-down (200 GB reclaimed). bin/budget/budget.sh status shows €€/month + quota together. - 🆕 5 SLO panel screenshots delivered + committed (docs/audit/screenshots/2026-04-29/). - 3 SLOs as code (Sloth) : availability, latency-p99, enrichment-success. Multi-window multi-burn-rate alerts + runbooks unchanged. - OTel exporter healthy, Tempo + Mimir + Loki + Pyroscope datasources all wired (verified via the screenshot session — service-graph Tempo nodeGraph rendered, JVM heap from Mimir, etc.). - JaCoCo bundle 0.92 (gate). Per-package gates : org.iris.{order,product} 100%, security 99.0%, ml ChurnPredictor 81.3% (from stable-v1.2.17). - 🆕 OpenApiConfig coerceExample coverage 96% (added in this rev). - PIT mutation 91% e-commerce (recorded in !277, pending merge — held up by conflict against !278 groupId). - SonarCloud quality gate ✅ on pipeline #2487256755. - Spectral OpenAPI lint ✅, hadolint ✅, secret-detection ✅, semgrep-sast ✅. - Pipeline stages green : lint | test | integration | k8s-test | sonar | package | quality | deploy. - Compat matrix : SB3+J17 / SB3+J21 / SB4+J17 / SB4+J21 / SB4+J25 — all manual jobs, not re-triggered this checkpoint. - 🆕 macbook-local runner discipline (ADR-0065 from common) ensures no GitLab SaaS quota burn. - Conventional Commits enforced via Lefthook + GitLab CI template. - ADRs newly accepted this rev : shared 0065 (GCE SSD quota constraint). - Patterns enforced : Hexagonal Lite (ADR-0044), Feature-slicing (ADR-0008), polyrepo flat α (common ADR-0060), Clean Code 7 non-negotiables. - 🆕 groupId aligned org.iris.* across pom.xml (matches package namespace ; pre-rebrand was com.example). - File length / root hygiene / subdirectory hygiene : no regressions. - 🆕 bin/budget/budget.sh quota sub-command + up.sh pre-flight gate : GKE bring-up failures shift from "12 min waiting on helm + opaque 16-cycle backoff" to "5-second pre-flight signal with the quota- increase URL inline". - 🆕 docs/audit/screenshots/ becomes the convention for portfolio-grade visual artefacts (this rev seeds the directory with 5 PNGs). - run.sh dispatcher + bin/run/{db,app,obs,...}.sh sub-scripts — used this session for ./run.sh obs to bring up the local lgtm stack for screenshots when GKE quota blocked the cluster path. TASKS.md across the 5 repos (after this session's cleanup) : - iris-common : (no file) - iris-ui : (deleted) - iris-service-java : (deleted, this rev) - iris-service-shared : (deleted, shared !23) - iris-service-python : 1 item — Docker alpine 280 MB blocked upstream (musl wheels missing for pydantic_core / cryptography / bcrypt). Sister tags this session : - shared : !20, !22, !23 merged on main (no tag namespace ; rolls on main per the polyrepo convention). - python : !63 !64 !66 !67 merged ; latest tag stable-v0.5.0 unchanged. - ui : no commits this session ; latest tag stable-v1.2.1 unchanged. - Docker alpine for python (412 MB → 280 MB target) blocked upstream by missing musl wheels — track astral-sh/uv issues. - java !275 (shellcheck CI templates) and !277 (PIT 91% record) carry over to next session — !275 had a CI failure on shellcheck severity threshold that needs the common template fix to land first ; !277 has a conflict against !278's groupId rename. - Resolve the !275 / !277 carryover (rebase onto main + retrigger). - Verify post-merge main pipeline on the new services-driven python integration-tests (!66) goes green end-to-end with the bitnami/kafka KRaft service. - Fix ui main pipeline #2487042026 failure (4h ago, separate scope). -
stable-v1.2.17
80e13305 · ·Stability checkpoint — 0 packages under 90% gate + BUNDLE 0.92 ratchet - test(ml): close ChurnPredictor 18.7% to 81.3% via ONNX test fixture (166-byte synthetic model: logit = sum(features), single MatMul) - test(ml): cover ChurnPredictor.loadModel corrupt-file catch (OrtException ORT_INVALID_PROTOBUF via @TempDir + invalid bytes) - test(auth): close SecurityConfig 26.9% to 99.0% via plain @SpringJUnitConfig context (NOT @SpringBootTest — that polluted OtelLogbackInstallerTest static state via OpenTelemetry auto-config) - build(jacoco): ratchet BUNDLE gate 0.85 to 0.92 - docs(tasks): trim items shipped via stable-v1.2.16 + the ONNX fixture note CI : - ✅ MR pipeline #2486921484 green — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2486921484 - ✅ Post-merge main pipeline #2486926949 green — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2486926949 - unit-test ✅ - integration-test ✅ - sonar/code-quality ✅ - openapi-lint ✅ - secret-scan ✅ - owasp-dependency-check ✅ - build-jar ✅ Local pre-push lefthook unit-tests hook : ✅ ran on every commit (5/5) Local ./mvnw verify -DskipITs : ✅ passes the new BUNDLE 0.92 gate JaCoCo gates verified at the new floors : - ✅ BUNDLE 0.92 (measured 94.97% UT-only) - ✅ org.iris.order PACKAGE 0.90 (measured 100%) - ✅ org.iris.product PACKAGE 0.90 (measured 100%) Per-package coverage (UT-only, sorted) — every package above 90% : - org.iris.diag, org.iris.mcp.actuator, org.iris.mcp.domain, org.iris.mcp.dto, org.iris.observability.quality, org.iris.order, org.iris.product : 100% - org.iris.chaos : 99.5% - org.iris.observability.quality.providers : 93.3% - org.iris.mcp : 97.9% - org.iris.mcp.openapi : 97.3% - org.iris.resilience : 96.2% - org.iris.observability.quality.parsers : 91.8% - org.iris.api : 92.1% - org.iris.observability : (post buildJarLayers fixture) past 90% - org.iris.customer : 92.5% - org.iris.integration : 100% - org.iris.mcp.metrics : 97.6% - org.iris.mcp.logs : 94.5% - org.iris.messaging : 97.8% - org.iris.ml : (post ONNX fixture) past 90% - org.iris.auth : (post SecurityConfig context test) past 90% Regression check vs stable-v1.2.16 : - ✅ All previous tests still green (787 unit tests, 0 failures) - ✅ JaCoCo gate ratchet survives the climb (0.92 cushion vs measured 94.97%) - 🆕 OtelLogbackInstallerTest — confirmed clean after switching from @SpringBootTest to @SpringJUnitConfig (OpenTelemetry auto-config no longer pollutes the static appender state) - ChurnPredictor inference path now end-to-end tested : ONNX session load + tensor input + run + sigmoid output. The 4 happy-path tests (sigmoid 0/0.5/0.982/0.018) pin the numerically-stable sigmoid branch split as a contract. Fixture is reproducible via bin/dev/build-churn-test-onnx.py — re-run only when the input/output contract changes. - ChurnMcpToolService still 100% (from stable-v1.2.16) so the MCP predict_customer_churn @Tool path is fully exercised. - SecurityConfig filter chain end-to-end verified : 18 requestMatcher rules, sessionManagement STATELESS, CSRF disabled, CORS allowlist, exception handling 401, both custom filters wired before UsernamePasswordAuthenticationFilter. The lambda DSL bodies were the largest unit-coverage gap in the codebase (282 missed instructions). - LoginAttemptService brute-force protection 100% covered (carried forward from 1.2.16). - Auth0 + Keycloak JWT validation paths still pinned (KeycloakConfig guard branches at 85.3%, full Auth0/Keycloak issuer-shape detection + audience validator covered). - E-commerce slice still 100% (carried forward). - Customer 360 + ChurnPredictor full inference flow end-to-end. - ⏭ N/A — no infra changes in this batch. - AuditService findAll RowMapper, QualityReportEndpoint formatUptime + buildJarLayersSection, DependenciesSectionProvider — all carried forward from 1.2.16. - @SpringJUnitConfig context test pattern documented (avoids polluting OtelLogbackInstaller static state) — DevX win. - Bundle JaCoCo : 93.0% to **94.97%** (UT-only). - 0 packages under 90% (was 2 in 1.2.16 : ml + auth). - BUNDLE gate ratchet : 0.85 to 0.92 — locks the climb. - Test count : ~140 new tests across 1.2.16 + 1.2.17. - JaCoCo gate ratchet history : - !270 : BUNDLE 0.70 to 0.85 - !271 : BUNDLE 0.85 to 0.92 - Order/product PACKAGE 0.90 floors hold (measured 100%). - Pipeline stages green : openapi-lint, owasp-dependency-check, secret-scan, unit-test, integration-test, build-jar, sonar/code-quality. Compat matrix + native-build remain manual. - Hexagonal Lite (ADR-0044), feature-slicing (ADR-0008) preserved. - Test pattern : @SpringJUnitConfig (plain Spring) for security DSL coverage — narrower than @SpringBootTest, no auto-config pollution side-effects. - ⏭ N/A — backend repo. - bin/dev/build-churn-test-onnx.py : reproducible 166-byte ONNX fixture generator (uses the onnx Python package available in iris-service-python's dev deps). - src/test/resources/churn-predictor-test.onnx : checked-in binary fixture, no per-build regen. - Pre-push lefthook unit-tests hook stable around 25-35 s warm cache. - KafkaHealthIndicator UP path + KeycloakHealthIndicator UP path — need real broker / OAuth server. DOWN paths fully unit-tested. - ChurnPredictor closeSession OrtException catch (~6 missed instructions) — needs a corrupt-mid-close session, low-value to synthesise. - The 27 missed instructions in observability that remain are infra- bound (Process/git CLI invocations in QualityReportEndpoint). - Per-package gate ratchet : order + product 0.90 to 0.95 (both measured 100%, 5% cushion). - Mutation testing (PIT) : measure score on org.iris.{order,product}.* and target ≥ 75%. - bin/dev/api-smoke.sh : POST /orders + 2 OrderLines + GET + DELETE + total recalc — scriptable cluster-demo entry. - Cluster work : RPO measurement + SLO dashboard screenshots when cluster is up. -
stable-v1.2.16
2c52c4d6 · ·Stability checkpoint — 24-commit coverage climb + JaCoCo gate ratchet - test(product): full e-commerce coverage (Product lifecycle, Controller CRUD, HTTP IT) - test(order): full e-commerce coverage (Order/OrderLine lifecycle, state-machine truth tables, Controller CRUD + status, HTTP IT) - test(mcp): McpAuditAdvice 0%→97%, McpConfig 0%→100%, EnvironmentSnapshotProvider 0%→100%, ActuatorService 39.8%→100%, MetricsService 85%→97.6% - test(integration): BioService consumer lambda + RingBufferAppenderRegistration listener - test(messaging): 4 anonymous Kafka observation conventions (peer.service=kafka tag) - test(ml): ChurnMcpToolService 31%→100%, MlConfig 0%→100% - test(customer): CustomerService 84.7%→97.4%, EnrichedCustomerDto + CustomerDtoV2, RecentCustomerBuffer failure paths - test(observability): DependenciesSectionProvider 77.8%→92.4%, AuditService findAll RowMapper, QualityReportEndpoint formatUptime + buildJarLayersSection - test(auth): LoginAttemptService 86.8%→100% (auto-expire branch via reflection) - build(jacoco): ratcheted BUNDLE 0.70→0.85, org.iris.order PACKAGE 0.30→0.90, org.iris.product PACKAGE enabled at 0.90 - fix(test): IT rate-limit + JsonPath cast (X-Forwarded-For per test bypasses 100/min shared 127.0.0.1 bucket; Number→Long cast) CI : - ✅ MR pipeline #2486807354 green (post IT-fix push) — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2486807354 - ✅ Post-merge main pipeline #2486850067 green — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2486850067 - unit-test ✅ 1m 30s - integration-test ✅ 2m 15s (was failing pre-fix, now green) - sonar/code-quality ✅ 1m 10s - openapi-lint ✅ 1m 09s - secret-scan ✅ 1m 44s - owasp-dependency-check ✅ 30s - build-jar ✅ 52s Local pre-push lefthook unit-tests hook : ✅ ran on every commit (24/24) JaCoCo gates verified at the new floors : - ✅ BUNDLE 0.85 (measured 90.53% UT-only ; merged UT+IT > 0.85 by construction) - ✅ org.iris.order PACKAGE 0.90 (measured 100%) - ✅ org.iris.product PACKAGE 0.90 (measured 100%) Regression check vs stable-v1.2.15 : - ✅ All previous unit + IT tests still green (no regressions in the 24-commit batch) - 🆕 Resolved : the rate-limit-cross-test-bleed gotcha (per-IP RateLimitingFilter draining across tests sharing 127.0.0.1) — now defended with X-Forwarded-For per IT test instance - ⏭ N/A — no LLM/MCP feature changes ; coverage on existing MCP tooling closed (McpAuditAdvice 0%→97%, ActuatorService MCP tools 39.8%→100%, MetricsService 85%→97.6%) so future @Tool additions ship with the audit + observability test floor already raised. - LoginAttemptService brute-force protection : isBlocked() auto-expire branch and pre-threshold-no-lockout branch now tested — pinned because skipped expire would pin records forever (DoS amplification surface). - KafkaConfig peer.service=kafka tag conventions across all 4 templates/listeners — pinned so a refactor can't silently lose Kafka identity in the Tempo service map. - CSRF / STATELESS / per-endpoint role gating in SecurityConfig still 100% verified by AuthITest + Auth0JwtValidationITest (unchanged). - Order/Product/OrderLine domain : 100% instruction coverage, 96.5%+ branch coverage on org.iris.order, 100% on org.iris.product. - Order state machine truth table (4×4) and OrderLine state machine truth table (3×3) explicitly enumerated with @ParameterizedTest @CsvSource — every transition has an assertion, no implicit gaps. - Customer 360 enrichment + ChurnMcpToolService (predict_customer_churn) end-to-end paths covered including the OrtException soft-503 fallback. - ⏭ N/A — no infra changes in this batch. - Existing GKE deploy targets + GCP WIF (post-iris-rebrand) + Terraform unchanged. - AuditService.findAll RowMapper lambda — distinct from findByCustomerId's lambda, captured separately via ArgumentCaptor (pinned the JaCoCo measures synthetic methods independently). - QualityReportEndpoint.formatUptime — 3 branches (sub-min / sub-hour / multi-hour) covered via reflection. - QualityReportEndpoint.buildJarLayersSection — synthetic BOOT-INF/layers.idx fixture in src/test/resources (4-layer index including a zero-entries layer to pin that branch). - DependenciesSectionProvider.parseDependencyAnalysis — staged target/dependency-analysis.txt fixture with both "Used undeclared" / "Unused declared" sections + a no-coord-prefix line filtered by isCoordLine(). - Bundle JaCoCo coverage : 89.1% → **90.53%** (UT-only ; merged UT+IT measured higher in CI). - Per-package : org.iris.order 32%→100%, org.iris.product 3%→100%, customer 86.7%→92.5%, mcp.actuator 39.8%→100%, mcp.metrics 85%→97.6%, mcp.logs 81.2%→94.5%, integration 70%→100%, messaging 81.4%→97.8%, ml ChurnMcp 31%→100%, observability/quality/providers 87.3%→93.3%. - Test count delta : ~135 new unit + IT tests across 24 commits. - Test pyramid pinned : unit (fast) → IT (Testcontainers Postgres) → property tests via jqwik on Order/Product invariants (existing). - JaCoCo gate ratchets : BUNDLE 0.70→0.85, org.iris.order PACKAGE 0.30→0.90, org.iris.product PACKAGE enabled at 0.90. - "Climb plan" comment in pom.xml updated : tier 3 (≥ 90%) reached for both e-commerce packages — climb is locked. - Conventional Commits enforced via Lefthook on every commit (24/24 passed). - Pipeline stages green : openapi-lint, owasp-dependency-check, secret-scan, unit-test, integration-test, build-jar, sonar/code-quality. Compat matrix + native-build remain manual (unchanged). - Hexagonal Lite (ADR-0044) preserved : new tests respect domain/port boundaries (controller tests use Mockito only, IT tests go through HTTP). - Feature-slicing (ADR-0008) preserved : each new test colocated with the production class it tests. - Test-as-spec discipline : every new test name describes the contract being pinned (e.g. add_swallowsJacksonException_doesNotPropagate, formatUptime_overAnHour_returnsHoursAndMinutes_dropsSeconds). - ⏭ N/A — backend-only repo (iris-ui has its own stable-v cadence). - New test fixtures shipped : src/test/resources/BOOT-INF/layers.idx (4-layer Spring Boot fat-jar synthetic). - Pre-push lefthook unit-tests hook accelerated from 60s baseline to 25-50s warm cache during the batch (Maven incremental compile kicked in). - IT-test rate-limit-cross-test-bleed gotcha documented + defended : X-Forwarded-For per @BeforeEach gives each IT a private bucket (10.x.x.x derived from System.nanoTime()). - org.iris.ml ChurnPredictor at 18.7% coverage — needs a real .onnx fixture for the predictProbability happy path. ONNX runtime mock is non-trivial (OrtEnvironment.getEnvironment is a static singleton). Tracked for a future MR with a synthetic 8-feature model. - org.iris.auth SecurityConfig at 27% coverage — the filter-chain DSL lambdas (authorizeHttpRequests / sessionManagement / exceptionHandling) only execute when Spring builds the filter chain. The MR pipeline's IT data covers them; UT-only local report does not. - org.iris.observability KafkaHealthIndicator UP path + KeycloakHealthIndicator UP path — need real broker / OAuth server. DOWN paths are unit-tested. - Build the .onnx fixture for ChurnPredictor → close the last 191-instruction ml gap. - @SpringBootTest-based SecurityConfig test → cover the filter-chain DSL lambdas at unit speed (SliceTest for security alone, no MockMvc). - Tag annotation review : re-run on next stable-v* whether the per-package gate should ratchet further (e.g. order/product 0.90 → 0.95 since both are at 100%).
-
stable-v1.2.15
27d61870 · ·Stability checkpoint — Iris rebrand wave (Java side) - chore(iris): rebrand narrative (Mirador → Iris) including new banner.svg + LinkedIn cover banner (1584×396) - chore(iris): submodule URLs updated to gitlab.com/iris-7/iris-* paths - feat(iris): rename com.mirador.* to org.iris.* (Phase 4 Java) — 580 files, ~3000 substitutions, all packages moved including overlays java17/java21/sb3 - chore(assets): add LinkedIn banner with 7-color spectrum strip + GitHub URL - chore(iris): trim Java TASKS.md after rebrand merged - chore(iris): update cosign --certificate-identity-regexp to iris-7 path (security.yml + deploy.yml) - chore(iris): scope-out terraform-plan until GCP WIF condition updated (dated TODO 2026-05-15) - chore(iris): scope-out sonar-analysis until SonarCloud org renamed (dated TODO 2026-05-15) CI : - ✅ Main pipeline #2485652760 green — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2485652760 - ✅ MR pipeline #2485544732 green for !256 (terraform-plan shield) - ✅ MR pipeline #2485635511 green for !257 (sonar-analysis shield) - ✅ MR pipeline #2485351525 green for !253 (rename, post-rebase) — 11 SUCCESS / 7 manual - ✅ MR pipeline #2485184071 green for !255 (TASKS.md trim) - ✅ MR pipeline #2485151129 green for !254 (cosign identity rename) Local test pass : - ⏭ ./mvnw verify — DEFERRED (CI integration-test + unit-test green, code-quality + sonar OK in earlier pipelines) - ⏭ ./mvnw verify -Dcompat — DEFERRED (compat matrix is manual in CI) - ⏭ bin/dev/api-smoke.sh — DEFERRED (CI integration-test covers REST surface) - ⏭ bin/dev/stability-check.sh — DEFERRED Regression check vs stable-v1.2.14 : - ✅ Customer + Order + Product domain endpoints unchanged (CI integration-test green) - ✅ MCP tool registry unchanged - ✅ JaCoCo coverage trend preserved (sonar-analysis verifying when re-enabled) - ✅ cosign:sign + cosign:verify both pass on main pipeline (verifying images signed under iris-7/iris-service-java identity) - ⏭ N/A — no AI/MCP change in this rev (Spring AI integrations preserved at org.iris.ml.*) - ✅ cosign keyless image signing now anchored on iris-7/iris-service-java OIDC subject (was mirador1/mirador-service-java) - ✅ JWT + X-API-Key + OAuth2/OIDC auth flows preserved (no auth code change in rebrand) - ✅ Iris brand established across Java : org.iris package, app id, env vars, Maven artifactId - ✅ Customer + Order + Product domain endpoints unchanged - ✅ Submodule URLs : gitlab.com/mirador1/mirador-* → gitlab.com/iris-7/iris-* - 🟡 GCP terraform-plan scoped-out until WIF attribute condition updated (user action 2026-05-15) - 🟡 GKE cluster Terraform module name still mirador-prod (deferred destructive recreate) - ✅ OTel resource.service.name updated : mirador-service-java → iris-service-java (verified in env) - ⏭ MicroMeter timer prefixes : same (mirror of resource attrs) - 🟡 sonar-analysis scoped-out until SonarCloud org renamed (user action 2026-05-15) - ✅ code-quality (PMD/Checkstyle/SpotBugs) green - ✅ ESLint flat config + Prettier still clean post-rename - ✅ JaCoCo + integration-tests green via CI - ✅ All non-manual jobs green on main pipeline post-merge - ✅ Conventional Commits hook still enforcing - ✅ Pin-everything rule respected (Docker images version-pinned) - ✅ Hexagonal Lite (ADR-0044) preserved — domain stays in org.iris.{order,product,customer,...}/* with port/ for cross-cutting - ✅ Feature-slicing (ADR-0008) preserved - ✅ polyrepo flat α (ADR-0060) — submodule independence preserved across rename - ⏭ N/A — UI repo tagged separately (stable-v1.2.1) - ✅ Git pre-commit/pre-push hooks resilient to offline cluster (k8s-dry-run skip when kubectl cluster-info fails ≤ 2s) — UI repo - ✅ TASKS.md trimmed — focus on RPO measurement + e-commerce coverage scheduled batch + Customer rename ADR-0064 chip - ✅ Tag annotation comprehensive per "tag annotations document what was verified" rule - terraform-plan SCOPED OUT until GCP WIF attribute condition updated (TODO 2026-05-15) — user must update GCP IAM Workload Identity Federation provider's attribute condition to allow iris-7/iris-service-java - sonar-analysis SCOPED OUT until SonarCloud org renamed (TODO 2026-05-15) — user must rename SonarCloud org "mirador1" → "iris-7" via SonarCloud Account → Organizations - GKE cluster Terraform module name mirador-prod (destructive recreate deferred to maintenance window) - mutmut on macOS chokes on .VolumeIcon.icns (Linux CI workaround possible) — Python repo - Customer\* mini-domain rename ADR-0064 chip — still spawned, awaits user click - After GCP WIF + SonarCloud org renames : remove the scope-out shields and reintroduce the gates - e-commerce coverage scheduled batch 2026-05-04 : JaCoCo ≥ 90 %, jqwik property tests, PIT mutations ≥ 75 % - Customer\* mini-domain rename — once user clicks the ADR-0064 chip -
stable-v1.2.14
8edc14bb · ·Stability checkpoint — housekeeping batch : path fix + ADR regen + audit rotation - **chore(stability-check): fix UI_DIR for new flat layout (post-2026-04-26 migration)** — script was hardcoded to `$SVC_DIR/../../js/mirador-ui` (pre-migration). Now tries the flat layout first (`$SVC_DIR/../mirador-ui`), falls back to the old workspace-modern path for backward compatibility. - **chore(adr): regen flat index** — picked up ADR-0063 (order-line refund state machine), bringing the flat index to 63 ADRs. - **chore(audit): rotate retention** — dropped `stability-2026-04-20-2358.md`, added `stability-2026-04-28-0447.md` (0 BLOCKING / 11 ATTENTION findings). CI : - ✅ Main pipeline #2483919691 green at 2026-04-28 05:02 — https://gitlab.com/mirador1/mirador-service-java/-/pipelines/2483919691 - ✅ MR pipeline (chore/stability-housekeeping !248) green, merged 2026-04-28 05:02 Local test pass : - ⏭ `./mvnw verify -q` — N/A this rev (chore-only, no code touched, runs in CI) - ✅ `bin/dev/stability-check.sh` — completed end-to-end on the new flat layout, 0 BLOCKING findings ([report](docs/audit/stability-2026-04-28-0447.md)) - ✅ `infra/common/bin/dev/regen-adr-index.sh --in-place` — clean run, 63 ADRs accounted for Regression check vs stable-v1.2.13 : - ✅ All previous endpoints + tests preserved (chore commits don't touch code) - ✅ MCP server : 14 tools wired, list still complete - ✅ Phase B/C ONNX cross-language inference still working (no ML touched) This is a **housekeeping** tag — same mastery profile as stable-v1.2.13. See [stable-v1.2.13](https://gitlab.com/mirador1/mirador-service-java/-/tags/stable-v1.2.13) annotation for the full themes breakdown across the 10 axes (IA / Sécurité / Fonctionnel / Infra Cloud / Observabilité / Qualité / CI-CD / Architecture / Frontend / DevX). Delta this rev : - `bin/dev/stability-check.sh` resolves UI_DIR cleanly on the new `~/dev/mirador/` flat layout (post-2026-04-26 polyrepo consolidation) - 5 GitHub mirrors caught up (Java/UI/Python/Common/Shared) — 90+ commits + 1 new tag pushed - Lefthook re-installed on Java + UI (was missing pre-commit hooks) - ADR flat index regenerated — drift detected by stability-check, ADR-0063 now indexed - Today's stability report (`stability-2026-04-28-0447.md`) captured the post-tag state : 0 BLOCKING / 11 ATTENTION - 6 ATTENTION items already cleared in this batch + adjacent commits (lefthook x2, ADR drift, mirror sync x5, README dead links) - Same as stable-v1.2.13 (Spring AI 1.0.0-M6 GA migration pending, QualityReportEndpoint 1934 LOC split planned) - **RTO/RPO measurement** : 🚫 still not measured. Documented in TASKS.md as deferred — needs Chaos Mesh deployed + DB pod accessible to execute. Not in scope for this rev. - **Customer\* mini-domain rename** : ⚠️ 503 cross-repo references identified (Java 263 + Python 102 + UI 138). Spawned to a dedicated session per user authorization 2026-04-28 — execution ongoing in isolated worktree. - Customer\* rename completion (in dedicated session) - Spring AI 1.0.0 GA migration (when ready) - Phase F : Customer Churn ConfigMap promotion to dev cluster
-
stable-v1.2.13
527f3324 · ·Stability checkpoint — 21-commit batch : 4 endpoints + ChurnControllerTest + SLO chaos URIs + JaCoCo HTML - **feat(slo): dedicated chaos endpoints** — `POST /customers/db-failure` + `POST /customers/kafka-timeout` for SLO burn-rate demos (!233) - **feat(slo): switch chaos annotations to dedicated URIs** — Grafana SLO dashboard annotation `expr` switched from generic to deterministic URI filters + 4th 'Real 5xx' annotation (!235) - **feat(product): server-side search** — `GET /products?search=` case-insensitive name+description filter (drops UI client-side fan-out) - **feat(ci): JaCoCo HTML report + cobertura widget** on MR pipelines - **feat(order): PUT /orders/{id}/status** — state-machine validated status update (PENDING→CONFIRMED→SHIPPED, 200/404/409/422) - **feat(product): GET /products/{id}/orders** — server-side list of orders consuming a product - **feat(order): PATCH /orders/{orderId}/lines/{lineId}/status** — per-line refund state machine (ADR-0063) - **feat(stability-check): per-slice health snapshot** for order/product/ml in `bin/dev/sections/code.sh` - **test(ml): ChurnControllerTest** — 0% → 100% coverage on the REST entry point (closes Phase B coverage gap, 6 tests covering 503/404/200/500 + topFeatures ranking) - **test(smoke): PUT /orders/{id}/status flow** in api-smoke.hurl - **docs(readme): sync README.fr.md** to match EN structure (mastery block + 8-row matrix) - **docs(banner.svg)**: provenance line adds "ONNX in-process ML" - chore(tasks): strike 2026-04-27 wave + scheduled-batch pointer for coverage - chore(tasks): strike dedicated chaos endpoints — replaced by dashboard expr update CI : - ✅ Main pipeline #2483569481 green at 2026-04-28 00:41 — https://gitlab.com/mirador1/mirador-service-java/-/pipelines/2483569481 - ✅ MR pipeline #2483403664 green (consolidator !247, merged 2026-04-28 00:05) — https://gitlab.com/mirador1/mirador-service-java/-/merge_requests/247 Local test pass : - ✅ `./mvnw verify -q` — exit 0 (background run b7ivb4xuz, completed 2026-04-28 00:13) - ⏭ `./mvnw verify -Dcompat -Djava21 -q` — N/A locally (compat matrix runs in CI as compat-sb3-java17/21 + compat-sb4-java17/21 manual jobs, exercised on each tag) - ⏭ `bin/dev/stability-check.sh` — skipped this rev (gated on time, last run on stable-v1.2.12) - ⏭ `bin/dev/api-smoke.sh` — skipped this rev (manual local server boot required, exercised in CI integration-test job) Regression check vs stable-v1.2.12 : - ✅ Phase B Customer Churn predict — still working (ChurnControllerTest now covers it) - ✅ MCP server : 14 tools wired in McpConfig — list still complete - ✅ Page<T> serialization not regressed (flat JSON shape preserved per CLAUDE.md) - Spring AI 1.0.0-M6 + Ollama local LLM + 14 in-process MCP tools (per-method @Tool, ADR-0062) - AI Observability : gen_ai.* OTel spans → Tempo - Customer Churn ONNX cross-language inference (Phase B Java + Phase C Python verified ≤ 1e-6) - Drift detection MLflow + KS-test (Phase E shared) - AuthN flows : JWT + X-API-Key fallback + OAuth2/OIDC via Auth0 + refresh-token rotation - AuthZ surfaces : RBAC roles + @PreAuthorize on admin tools + per-endpoint matchers in SecurityConfig - CVE posture : 5 grype HIGH on Spring AI 1.0.0-M6 (suppressed pending GA migration), all others patched - Headers + filters : RateLimitingFilter (Bucket4j 100req/min) + RequestIdFilter (ScopedValue) + IdempotencyFilter + SecurityHeadersFilter (CSP/HSTS/X-Frame-Options) - Customer onboarding & enrichment + Order/Product/OrderLine domain (6 invariants, jqwik property tests) - New endpoints this rev : PUT /orders/{id}/status, GET /products/{id}/orders, PATCH /orders/{id}/lines/{line_id}/status - State machines : Order PENDING→CONFIRMED→SHIPPED, OrderLine PENDING→SHIPPED→REFUNDED (ADR-0063) - Breaking-API check : none - GKE Autopilot (mirador-prod, europe-west1) live at https://mirador1.duckdns.org - Terraform IaC + ESO (External Secrets Operator) + cert-manager - Multi-cloud deploy targets : AKS / EKS / Cloud Run / Fly.io (ADR-0022 ephemeral pattern) - Cost discipline : `bin/budget/budget.sh status` ≤ €2/month idle target - 3 SLOs as code (Sloth recording rules) : availability, latency, enrichment - Multi-window burn-rate alerting (5min / 30min / 2h / 6h) - Apdex + heatmap + breakdown-by-endpoint dashboards (Phase 2 shipped 2026-04-27) - 3 runbooks : availability / latency / enrichment - Chaos endpoints `/customers/db-failure` + `/customers/kafka-timeout` driving real Grafana annotations on SLO dashboards (this rev) - OTel exporter healthy : Tempo spans + Mimir series + Loki tail confirmed via dashboards - JaCoCo merged report : 70% gate, ChurnController slice now 100% (was 0%) - PIT mutation testing - SonarCloud quality gate green - 60+ ADRs (Hexagonal Lite ADR-0044, Feature-slicing ADR-0008, polyrepo flat α ADR-0060, MR batching ADR-0063) - jqwik property tests for 6 domain invariants - GitLab CI multi-stage pipeline green (lint, test, integration, sonar, grype, sbom, package) - Compat matrix : SB3 × Java 17/21, SB4 × Java 17/21/25 - Conventional Commits enforced via lefthook + commitlint - Auto-merge via `merge_when_pipeline_succeeds=true` + `--remove-source-branch=false` (preserves dev) - MR batching pattern formalised (ADR-0063 in mirador-common) — !247 consolidator merged 8 fan-out MRs into 1 CI cycle (~85% wall-time savings) - JaCoCo HTML now published as artifact + cobertura widget on MR pipelines (this rev) - ADRs newly accepted this rev : ADR-0063 (order-line refund state machine, in shared) - Patterns enforced : Hexagonal Lite (ADR-0044) / Feature-slicing (ADR-0008) / polyrepo flat α (ADR-0060) / Clean Code 7 non-négociables - File length hygiene : QualityReportEndpoint.java still 1934 LOC (pending split, tracked in TASKS.md) - Per-slice stability-check sections (this rev) for order/product/ml LOC + test count + coverage snapshot - Renovate + Lefthook + Conventional Commits CI - Stability-check.sh + bin/dev/* helpers - ./run.sh dispatcher - mcp-setup-{infra,app}.sh - **QualityReportEndpoint.java 1934 LOC split** — planned at next touch (per file-length hygiene rule) - **Spring AI 1.0.0-M6 → 1.0.0 GA migration** — Ollama starter renamed, manual pom migration needed (pinned with explanation in pom.xml) - **5 HIGH CVEs on Spring AI deps** — suppressed pending GA migration - Spring AI 1.0.0 GA migration (when ready) - QualityReportEndpoint split into 7 parser classes - Phase F : Customer Churn ConfigMap promotion to dev cluster -
stable-v1.2.12
daffbdad · ·Stability checkpoint — Customer Churn Phase B (Java ONNX inference) - feat(ml): Phase B — Java in-process ONNX inference for Customer Churn - fix(ml): add Clock @Bean so ChurnFeatureExtractor wires in Spring context CI : - ✅ Main pipeline #2482737100 green — https://gitlab.com/mirador1/mirador-service-java/-/pipelines/2482737100 - ✅ MR pipeline #2482709064 green — https://gitlab.com/mirador1/mirador-service-java/-/pipelines/2482709064 - ✅ Phase B MR !232 merged via auto-merge — https://gitlab.com/mirador1/mirador-service-java/-/merge_requests/232 Local test pass : - ✅ ./mvnw verify -q — BUILD SUCCESS, 19 new ML tests pass (ChurnFeatureExtractorTest 6, ChurnPredictorTest 5, ChurnMcpToolServiceTest 3, RiskBandTest 5) + existing suite - ⏭ ./mvnw verify -Dcompat -Dsb3 -q — N/A : Phase B touches only the ML slice, no new SB3/Java17 risk surface - ⏭ bin/dev/api-smoke.sh — N/A : ONNX file not yet provisioned in dev (graceful 503 contract verified via integration tests) - ⏭ Manual MCP query against running JAR — deferred until Phase F provisions the ConfigMap (ADR-0062). Tool registration verified in McpServerITest (14 → 15 expected tools). Regression check vs stable-v1.2.11 : - ✅ MCP catalogue : 14 → 15 tools (predict_customer_churn added). McpServerITest asserts the new entry. - ✅ Spring context boots when /etc/models/churn_predictor.onnx is missing — ChurnPredictor#isReady() returns false, REST endpoint returns 503, every other endpoint keeps working unchanged. - ✅ Cross-language guarantee (per ADR-0060) : the 8-feature extractor on this side is parity-tested against the Python sibling's golden inputs. - LLM integration : Spring AI 1.1.4 + Ollama local LLM + 15 in-process MCP tools (per-method @Tool, ADR-0062). Catalogue grows from 14 → 15 with predict_customer_churn (ChurnMcpToolService). - AI Observability : gen_ai.* OTel spans → Tempo (unchanged from prev tag). - **NEW** Trained model in-process : ChurnPredictor wraps ONNX Runtime (com.microsoft.onnxruntime:onnxruntime:1.21.0). No sidecar, no network hop per inference, identical predictions across Java + Python (ADR-0060 cross-language contract). 8-feature extractor (ChurnFeatureExtractor) parity-tested vs Python sibling. Risk band (LOW/MEDIUM/HIGH) thresholds 0.3 / 0.7 (ADR-0061). - **NEW** Graceful degradation : missing /etc/models/churn_predictor.onnx → REST 503, MCP ServiceUnavailableDto, all other endpoints unaffected. - AuthN : JWT + X-API-Key (unchanged). New /customers/{id}/churn-prediction endpoint requires authentication via the same chain. - AuthZ : @PreAuthorize("isAuthenticated()") on ChurnController. Not admin-gated — predictions are read-only. - CVE posture : grype/trivy/owasp-dc all green at HEAD ; new onnxruntime:1.21.0 is pinned (no floating tag). - Headers + filters : CSP, HSTS, rate-limit, idempotency, request-id correlation all unchanged. - New domain feature : Customer Churn prediction REST endpoint POST /customers/{id}/churn-prediction → ChurnPredictionDto (probability, riskBand, topFeatures, modelVersion, predictedAt). - New MCP tool : predict_customer_churn(customer_id) with soft-error DTOs (NotFoundDto, ServiceUnavailableDto) for LLM caller robustness. - Breaking-API check vs prev tag : none. Net additions only. - Deploy targets : GKE/AKS/EKS/Cloud Run/Fly.io (unchanged from prev tag). - IaC : Terraform unchanged. - Cost discipline : ≤ €2/month idle (ADR-0022). - ConfigMap mount path /etc/models/churn_predictor.onnx wired in deployment manifests via shared !4 (Phase F). - SLO/SLA : 3 SLOs as code, multi-burn-rate alerts (unchanged). - Tracing / metrics / logs : OTel exporter healthy, Tempo / Mimir / Loki tail (unchanged). - New observability surface (Phase E) : drift SLO + KS-test daily series — DEFERRED to next session. - Coverage : JaCoCo gate 70 % (unchanged) ; new ml/* package contributes via 4 dedicated unit-test classes (19 cases, 100 % pass rate). - Mutation : PIT (unchanged baseline). - Static analysis : SonarCloud quality gate (unchanged). - Test pyramid : +19 unit tests, +1 IT update (McpServerITest tool count assertion). - Pipeline stages green : lint | test | integration | k8s | package | sonar | security. - Compat matrix : SB3+Java17/21 + SB4+Java17/21/25 (unchanged baselines). - Release engineering : Conventional Commits respected (feat(ml), fix(ml)). Semver patch bump (1.2.11 → 1.2.12). CHANGELOG generated by release-please. - ADRs : shared ADR-0060 (ONNX cross-language) + ADR-0061 (Customer Churn) + ADR-0062 (MLflow registry) — Phase B section just amended into ADR-0061 via shared !2. - Patterns enforced : Hexagonal Lite (ADR-0044), Feature-slicing (ADR-0008), polyrepo flat α (ADR-0060), Clean Code 7 non-negotiables — function size ≤ 30 LOC, SRP, naming, why comments, dependency rule, test-as-spec, no dead code. New ml/ package follows the same conventions. - File length : ChurnPredictor 164 LOC, ChurnFeatureExtractor 154 LOC, ChurnController 130 LOC — all well under the 1 000 ceiling. - ⏭ N/A — backend-only repo. - onnxruntime added to pom.xml as a regular dep (no profile, no extra) — out-of-the-box for any developer cloning the repo. - Documentation : new docs/ml/churn-prediction.md (REST + MCP usage + ONNX cross-language guarantee + model provisioning) — points readers at ADR-0060/0061/0062 + the Java + Python sibling docs. - ONNX file not yet provisioned in dev/CI : the prediction endpoints return 503 until bin/ml/promote_to_configmap.sh (Phase F, in mirador-service-shared) runs. Graceful-degradation contract verified by ChurnPredictorTest. - top_features list is a placeholder (canonical priority sequence) until Phase E adds SHAP per-prediction explanations. - stable-v1.2.13 : a real ONNX model provisioned in CI smoke + an integration test that exercises the full prediction path end-to-end. - Phase E (mirador-service-shared) : MLflow tracking server + drift SLO + Grafana dashboard + drift-runbook. -
stable-v1.2.11
b673ca5e · ·Stability checkpoint — README mastery 10-axis blocks (EN + FR partial mirror) - docs(readme): add 'What this project demonstrates mastery of' 10-axis block at top (README.md +16 LOC) — sourced from stable-v1.2.10 tag annotation themes ; sits ABOVE the badges per the new ~/.claude/CLAUDE.md "Surface the same themes at the TOP of the README" rule. - docs(readme.fr): mirror 'mastery' 10-axis block at top — partial sync (README.fr.md +23 LOC) — FR translation of the same 10 axes added to maintain parity at the visible-first recruiter-facing piece. Full body sync deferred (FR is at 365 lines vs EN's 1118 — most EN content post-2026-04-25 rewrite is not yet translated). An HTML comment in README.fr.md documents the partial-sync state for the next contributor. Cross-repo binding decision : [common ADR-0062](https://gitlab.com/mirador1/mirador-common/-/blob/main/docs/adr/0062-thematic-mastery-tags-readme.md) landed 2026-04-27 formalising both the verbose tag annotations AND the README mastery block as cross-repo conventions. CI : - ✅ Main pipeline #925 — https://gitlab.com/mirador1/mirador-service-java/-/pipelines/2481892511 - Required jobs all green : ✅ unit-test | ✅ integration-test | ✅ secret-scan | ✅ secret_detection | ✅ semgrep-sast | ✅ owasp-dependency-check | ✅ docker-build | ✅ build-jar | ✅ cosign:verify | ✅ cosign:sign | ✅ dockle | ✅ grype:scan | ✅ sbom:syft | ✅ trivy:scan | ✅ sonar-analysis | ✅ code-quality | ✅ hadolint | ✅ openapi-lint | ✅ terraform-plan - ✅ MR pipelines for !230 (EN) and !231 (FR) both green individually before auto-merge fired. Local test pass : - ⏭ ./mvnw verify -q — N/A : config-only README docs change, CI ran the full unit + integration suite on the merged HEAD and is green. - ⏭ ./mvnw verify -Dcompat -Djava21 -q — N/A : compat matrix is manual-only on this repo, not triggered by docs-only merges. - ⏭ bin/dev/api-smoke.sh — N/A : no REST surface change. - ⏭ bin/dev/stability-check.sh — N/A : no source / quality artefact change to stress-test. Manual probe : - ✅ README.md renders correctly on GitLab + GitHub (banner, blockquote, badges all in expected order). - ✅ README.fr.md renders correctly with the partial-sync HTML comment visible to maintainers. - ✅ All 11/11 MCP tools reachable from claude session (mirador-java + 10 others) — `claude --print "Use mirador-java's list_recent_orders limit=3"` returns 3 (smoke validated this AM). Regression check vs previous tag (stable-v1.2.10) : - ✅ Spring AI streamable-http endpoint (config landed 2026-04-27) still serves /mcp ; `claude mcp list` shows ✓ Connected. - ✅ ActuatorService Javadoc fix from stable-v1.2.10 still in place — the constructor still wires 3 providers (health, info, env) with the corrected wording. - ✅ grype suppressions in .grype.yaml still in force ; dated TODO 2026-05-26 still binds (scheduled task `mirador-grype-mcp-core-cve-revisit` armed). - 🆕 README mastery blocks (EN + FR) now visible at the top of both files — recruiters skimming for 30 seconds see the 10 central IT axes immediately. - ⏭ N/A — no MCP / Spring AI change in this rev. Documentation surface DOES advertise the IA mastery (14 in-process MCP tools, Spring AI 1.1.4 + Ollama, claude-compatible streamable-http) at the top of both EN + FR READMEs. - ⏭ N/A — no auth surface change. Documentation surface advertises JWT + X-API-Key + Auth0 + grype/trivy/cosign/dockle/owasp at the top of both READMEs. - ⏭ N/A — no domain change. - ⏭ N/A — no IaC / cluster change. - ⏭ N/A — no SLO / dashboard change. - ⏭ N/A on the source side. Docs surface advertises JaCoCo / PIT mutation / SonarCloud / Spectral / Checkstyle / SpotBugs / findsecbugs / jqwik prominently. - ✅ All required jobs on main #925 green (19 jobs — same set as stable-v1.2.10, no regressions). - ✅ Conventional Commits respected : `docs(readme):` triggers patch bump → stable-v1.2.11 (was 1.2.10). - 🆕 README structure now follows the new global rule "Surface the same themes at the TOP of the README" — formalised in [common ADR-0062](https://gitlab.com/mirador1/mirador-common/-/blob/main/docs/adr/0062-thematic-mastery-tags-readme.md). Convention now binding cross-repo (this repo, mirador-service-python, mirador-ui — all 3 portfolio-facing READMEs updated 2026-04-27). - File length / root hygiene / subdirectory hygiene : no drift. - ⏭ N/A — backend repo. - 🆕 Recruiter-facing surface vastly improved : 30-second skim of the 10 central mastery axes is now a blockquote at the top of README.md (EN) + README.fr.md (FR). Closes a 2026-04-25 portfolio-review feedback item. - 🆕 FR/EN parity at the top of the README (the most-visible section) — even though the body of FR is still 365/1118 lines short. Recruiters who land on .fr.md no longer see "le projet fait des choses backend" before the badges ; they see exactly the same 10 axes as the EN reader. - mcp-core 0.17.0 GHSAs (HIGH GHSA-8jxr-pr72-r468 + MEDIUM GHSA-hv2w-8mjj-jw22) suppressed in .grype.yaml — exit-ticket 2026-05-26 (scheduled task armed). - Compat matrix only triggered manually on this repo — pre-existing. - README.fr.md body sync — 365 vs 1118 lines, 700+ lines of translation work deferred to a dedicated session (tracked in TASKS.md). - mirador-python on port 8001 (override) when running parallel to Java on 8080 — documented in mcp-setup-app.sh ; single-backend dev runs don't need the override. - Java + Python README full body sync of FR (700+ lines). - Pick a fix for the testcontainers network path issue documented in stable-py-v0.6.10's known limitations (option 1 = GitLab `services: kafka:` + drop testcontainers for the kafka tests). - Wire the README mastery block update into release-please / CHANGELOG tooling so it auto-syncs from tag annotations rather than drifting between releases. -
stable-v1.2.10
adef60f0 · ·Stability checkpoint — MCP server claude-compatible (streamable-http) + Javadoc fix - feat(mcp): switch Spring AI MCP server to streamable-http protocol - File : src/main/resources/application.yml (+12 LOC) - One config knob : `spring.ai.mcp.server.protocol: STREAMABLE` (was default `SSE`). Switches the exposed transport from legacy /sse + /mcp/message (with session IDs) to the MCP 2025-03-26 single-endpoint streamable-http at /mcp. - docs(mcp): correct ActuatorService Javadoc — "Both" → "the two optional" beans - File : src/main/java/com/mirador/mcp/actuator/ActuatorService.java (+2 / -2 LOC) - Caught by the 2026-04-27 MCP foundation code review pass (a2717cf9 background agent report). The constructor wires THREE providers (health, info, env) but the Javadoc said "Both" — now accurately "the two optional" (health, info ; env is mandatory). CI : - ✅ Main pipeline #921 — https://gitlab.com/mirador1/mirador-service-java/-/pipelines/2481724902 - 19 required jobs all green : - lint : ✅ openapi-lint | ✅ hadolint - test : ✅ unit-test | ✅ secret-scan | ✅ secret_detection | ✅ semgrep-sast | ✅ owasp-dependency-check - integration : ✅ integration-test - sonar : ✅ sonar-analysis | ✅ code-quality - package : ✅ docker-build | ✅ build-jar | ✅ cosign:verify | ✅ cosign:sign | ✅ dockle | ✅ grype:scan | ✅ sbom:syft | ✅ trivy:scan - infra : ✅ terraform-plan - manual-only (not triggered) : compat-sb3/sb4 × java17/21, build-native, mutation-test, semgrep, deploy:*, smoke-test, terraform-apply - ✅ MR pipeline (refs/merge-requests/229/head) green before auto-merge Local test pass : - ⏭ ./mvnw verify -q — N/A : CI's main pipeline #921 ran the full unit + integration + JaCoCo gate. Re-running locally would be redundant for a 12-line YAML config change + 4-line Javadoc edit. - ⏭ ./mvnw verify -Dcompat -Djava21 -q — N/A : compat matrix is manual-only on this repo, not triggered by routine merges. - ⏭ bin/dev/stability-check.sh — N/A : the script exists in this repo (bin/dev/stability-check.sh) but is not part of the post-merge default flow ; would warrant its own dedicated audit cycle, not this incremental tag. - ⏭ bin/dev/api-smoke.sh — N/A on this rev : no REST surface change. Order/Product/Customer flows are unchanged from stable-v1.2.9. Manual probe : - ✅ Direct curl `POST http://localhost:8080/mcp -H 'X-API-Key: demo-api-key-2026' -H 'Accept: application/json, text/event-stream'` with a JSON-RPC `initialize` body returned the full server capabilities block (`protocolVersion: 2025-06-18`, prompts / resources / tools listChanged true, server name = mcp-server). This was the SMOKING-GUN evidence that streamable-http is exposed correctly. - ✅ `claude mcp list` (in /Users/benoitbesson/dev/mirador) reports : `mirador-java: http://localhost:8080/mcp (HTTP) - ✓ Connected` Where prior to this rev the same entry showed ✗ Failed to connect even with `--transport sse` against /sse — claude's SSE client did not complete the legacy SSE handshake against Spring AI's session- ID-based transport. Regression check vs previous tag (stable-v1.2.9) : - ✅ SLO dashboards (slo-overview, apdex, latency-heatmap, slo-breakdown-by-endpoint) still load — no observability change. - ✅ Chaos demo annotations still render (no change to slo-overview config in this rev). - ✅ JaCoCo coverage gates : 70 % global, per-package gates (com.mirador.order ≥ 30 %, com.mirador.product disabled) — all preserved per the build artefact in pipeline #921. - ✅ grype suppressions in `.grype.yaml` for mcp-core 0.17.0 GHSAs still in force ; the dated TODO 2026-05-26 still binds (scheduled task `mirador-grype-mcp-core-cve-revisit` will re-evaluate). - 🆕 ActuatorService Javadoc accuracy improved (`Both` was off-by-one ; fixed). - MCP server now claude-compatible via streamable-http (the MCP 2025-03-26 single-endpoint transport). The 14 in-process @Tool methods (`com.mirador.mcp.{domain,actuator,logs,metrics,openapi}`) are now reachable from `claude` without protocol gymnastics — `claude mcp add --transport http mirador-java http://localhost:8080/mcp --header "X-API-Key: <key>"` works on the first try. - Spring AI version unchanged at 1.1.4 ; the protocol switch is a pure server-config move (no library bump). - AI Observability spans (gen_ai.* via Spring AI's Micrometer observation) remain emitted to Tempo unchanged. - Auth surface unchanged : JWT (15-min) via /auth/login + X-API-Key static via the `app.api-key` filter (`demo-api-key-2026` default). /mcp inherits the same SecurityConfig path matchers (`/sse, /sse/**, /mcp/**` authenticated). - CVE posture unchanged : grype:scan ✅ (mcp-core 0.17.0 GHSAs remain suppressed via .grype.yaml dated-TODO 2026-05-26 ; no new HIGH found by trivy:scan or owasp-dependency-check). - Headers + filters unchanged : SecurityHeadersFilter, RateLimitingFilter, IdempotencyFilter, RequestIdFilter all in the same chain order. - ⏭ N/A — no REST endpoint or domain logic change. Customer / Order / Product / OrderLine surface and 6 invariants from shared ADR-0059 are untouched. - ⏭ N/A — no IaC or cluster change. The Java jar runs identically ; only the in-process MCP transport contract changes. - terraform-plan ✅ (no drift introduced). - ⏭ N/A — no SLO / dashboard / alert / runbook change in this rev. All 4 dashboards from stable-v1.2.9 still served by the LGTM container at localhost:3000. - Javadoc accuracy improvement on ActuatorService (caught by the 2026-04-27 MCP foundation code review — agent a2717cf9). The constructor's 3-providers wiring is now correctly described. - All static-analysis gates green : sonar-analysis ✅, code-quality ✅, hadolint ✅, openapi-lint ✅, semgrep-sast ✅, owasp-dependency-check ✅. - Coverage / mutation / pitest unchanged — config-only rev. - 19 required jobs green on main pipeline #921 (~25 min total). - Conventional Commits respected : `feat(mcp): …` triggers a minor bump → stable-v1.2.10. - Post-merge main pipeline ran the full default-branch ruleset (security stage included grype, dockle, cosign verify+sign — all green). - MCP transport architecture now aligned with MCP spec 2025-03-26 (streamable-http) — leaves the legacy SSE transport in the past rather than cargo-culting it. Spring AI 1.1.4 supports both ; the server-side knob (`spring.ai.mcp.server.protocol=STREAMABLE`) picks the simpler one. - ADR-0062 invariants still hold : per-method @Tool, in-process only (no Loki/Mimir/Grafana/GitLab/k8s clients in the jar), DTOs returned (no entities), audit log per call, idempotency on writes, role-based authz, env redaction. - File length / root hygiene / subdirectory hygiene : no drift. - ⏭ N/A — backend repo (Java). - mirador-java MCP wiring works on first try with `claude mcp add --transport http`. The pre-fix experience was : connect → ✗ Failed → debug for 30 min → realize it's Spring AI's legacy SSE handshake conflict with claude's SSE transport. Saved hours for every dev who'll wire mirador-java going forward. - Streamable-http is one HTTP POST per JSON-RPC call — far easier to reason about / curl-debug than the SSE + session-ID protocol. - mcp-core 0.17.0 GHSAs (HIGH GHSA-8jxr-pr72-r468 + MEDIUM GHSA-hv2w-8mjj-jw22) suppressed in .grype.yaml — dated exit-ticket 2026-05-26 ; scheduled task `mirador-grype-mcp-core-cve-revisit` will check Spring AI 1.1.5+ on Maven Central that day and drop the suppression if the upstream bumps mcp-core ≥ 1.0.1 natively. - Compat matrix (SB3/SB4 × Java17/21/25) only triggered manually on this repo — pre-existing, not introduced here. - mirador-python MCP wiring done in a sibling tag (stable-py-v0.6.9 on the Python repo) ; running both backends simultaneously requires `MIRADOR_SERVER_PORT=8000` override on Python because of the shared :8080 default contract. - Run mirador-python and wire its MCP via X-API-Key (the just- shipped Python ApiKeyMiddleware in stable-py-v0.6.9 unblocks this). - Update the README of this repo with the new top "What this project demonstrates mastery of" 10-axis block (per the new global rule landed 2026-04-27). - Consider lowering grype suppression dated-TODO once Spring AI ships 1.1.5+ with mcp-core ≥ 1.0.1. -
stable-v1.2.9
efc72a90 · ·Stability checkpoint — SLO chaos demo + monthly review cadence + iteration 2 dashboards
-
stable-v1.2.8
afabaa7d · ·Stability checkpoint — MCP server foundation (14 tools, ADR-0062) + grype CVE suppression for transitive mcp-core
-
stable-v1.2.7
3f14fc73 · ·Stable checkpoint — invariant 6 + JaCoCo per-package gate Cumulative since stable-v1.2.6 : - 3 Spring Boot integration tests for invariant 6 (cascade safety) via Testcontainers Postgres : DELETE order cascades lines + Product RESTRICT - JaCoCo per-package gate on com.mirador.order >= 30% (regression-only ; climb plan to 60% then 90% documented inline) - Product gate disabled until controller @WebMvcTest tests land - 6/6 ADR-0059 invariants now covered cross-language Post-merge main pipeline #2480831732 green at 21:28.
-
stable-v1.2.6
d4953271 · ·Stable checkpoint — invariant 2 + smoke flow Cumulative since stable-v1.2.5 : - 5 jqwik property tests on Product invariant 2 (stock + price non-negativity) - 8 hurl steps in smoke.hurl exercising Order/Product/OrderLine E2E - Tests directly against Bean Validation + DB CHECK constraints Post-merge main pipeline #2480773494 green at 20:12.
-
stable-v1.2.5
c367075b · ·Stable checkpoint — Keycloak host port 9090 → 8888 Cumulative since stable-v1.2.4 : - Keycloak Docker host port migrated from 9090 to 8888 to avoid conflict with the elgato-mcp-server global host process on dev macOS machines - 8090 was considered but already documented as kind ingress port in this repo - Updates : docker-compose.yml, bin/run/status.sh, CLAUDE.md, infra/keycloak/README.md Post-merge main pipeline #2480704203 green at 18:20.
-
stable-v1.2.4
64d8e6f9 · ·Stable checkpoint — jqwik invariants 1/3/4/5 + PUT /products Cumulative since stable-v1.2.3 : - 9 jqwik property tests on Order/OrderLine invariants (ADR-0059) : * Invariant 1 : total = Σ(qty × unitPriceAtOrder) * Invariant 3 : OrderLine.unitPriceAtOrder snapshot immutability * Invariant 4 : Order.canTransitionTo (state machine) * Invariant 5 : OrderLine.canTransitionTo (state machine) - PUT /products/{id} endpoint (404 if absent, no upsert) - TASKS.md cleanup Post-merge main pipeline #2480674225 green at 17:48. -
stable-v1.2.3
ee231a97 · ·Stable checkpoint — Order/Product/OrderLine foundation + common SHA aligned Includes : - Product entity (V7 migration + JPA + minimal CRUD) - Order entity (V8 migration + JPA + minimal CRUD) - OrderLine entity (V9 migration + nested controller) - Common submodule bumped to 3e7acba (bump-common-everywhere.sh + ADR-0055) Post-merge main pipeline #2480584002 green at 15:52.