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