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).