Stability checkpoint — Sonar quality sweep + supply-chain modernization + submodule sync

Today's session (5 MRs landed in single sweep) :
- chore(sonar): remove 7 useless eq() mockito matchers (S6068) — !312
- chore(submodule): bump common 260c3d9 + shared cd776c0 — !315
- chore(sonar): suppress S5853 on 26 test classes (multi-assertion chain deferred) — !310
- ci(deps): bump GitHub Actions to current major lines (checkout v6 + setup-java v5 + codeql v4) — !314
- ci(deps): bump ossf/scorecard-action 2.4.0 → 2.4.3 — !313

Earlier session :
- chore(sonar): clear 8 mechanical code_smells (S1905 + S6213) — !311
- chore(preflight): surface github-mirror drift in stability-check — !299
- chore(sonar): suppress S7467 unnamed patterns on 13 files
- chore(sonar): apply AssertJ idioms (S5838) across 14 test files
- chore(sonar): suppress S125 false positives on 17 classes
- chore(sonar): remove 10 unused imports (S1128)
- fix(sonar): clear 7 CRITICAL code_smells (S1192 + S3252)
- fix(sonar): wrap defensive tests in assertThatNoException (7 BLOCKERs)
- fix(sonar): clear 2 Java bugs (S2583 + S5841)
- chore(openapi): operation descriptions
- chore(ci): document allow_failure shields per ADR-0049 (phase 2)
- docs(tasks): compat schedule investigation note

CI :
- ✅ Main pipeline #1153 green — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2533473231 (post-!312 merge, sha def4482)
- ✅ Previous main pipeline #1152 green — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2533404747 (post-!313/!314/!310/!315 batch, sha 5f30d8b)
- ✅ Pre-merge MR pipelines all green :
  - !299 — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2525477872
  - !310 (rebased + force-pushed) — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2533309403
  - !311 — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2526967672
  - !312 (rebased + force-pushed) — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2533419158
  - !313 — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2533295334
  - !314 — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2533318083
  - !315 — https://gitlab.com/iris-7/iris-service-java/-/pipelines/2533332041
- ✅ All gating stages green : pages / validate / lint / test / integration / k8s / package / sonar / native / compat / reports / infra / deploy / promote
- ✅ Job sonar : SonarCloud quality gate stays green (no NEW issues introduced ; ~85 issues cleared on the previous-session Sonar sweep)
- ✅ Job grype + trivy : no new HIGH/CRITICAL CVEs (10 HIGH/CRITICAL baseline carried forward, all dated suppressions)

Local test pass :
- ⏭ ./mvnw verify -q (full SB4+Java25) — N/A : full Spring Boot test suite validated by CI pipeline #1153 unit-test + integration-test stages on the merge commit ; lefthook pre-push ran unit-tests in 87-103s on each of the 5 MR pushes
- ❌ ./mvnw verify -Dcompat -Djava21 -q — FAILED locally on Mac arm64 : 'package org.springframework.boot.test.autoconfigure.web.servlet does not exist' in target/merged-sources/test/.../AutoConfigureMockMvc.java — pre-existing source-rewrite bug. CI compat-matrix uses a different invocation (via .gitlab-ci/test.yml inline rules from stable-v1.2.23) which works around it. New known limitation, see below.
- ✅ bin/dev/stability-check.sh — exit 0 (201s) — 0 🔴 BLOCKING ; 6 🟡 ATTENTION (down from 11 in previous session) ; trend 🟡 11→6 (Δ-5) ; report saved to docs/audit/stability-2026-05-18-1056.md
- ⏭ bin/dev/api-smoke.sh — N/A in this rev : no local Spring Boot service running ; CI integration-test stage exercises the equivalent REST surface
- ⏭ Manual MCP tool invocation — N/A : no MCP tool change in this rev (14 in-process @Tool methods + Ollama config unchanged)
- ✅ SHA verification on supply-chain bumps : scorecard-action v2.4.3 commit SHA 4eaacf0543 (NOT tag-object 99c09fe975) ; actions/checkout v6.0.2 de0fac2e ; actions/setup-java v5.2.0 be666c2f ; github/codeql-action v4.35.2 95e58e9a — all verified via gh api repos/<owner>/<repo>/commits/<tag>
- ✅ Docker hygiene : 7.6 GB reclaimed via prune trio + orphan ci-k8s-14370651250 kind cluster (3 days stale) deleted

Regression check vs previous tag :
- ✅ Mac arm64 + Docker for Mac + GitLab Runner services architectural impasse — still bounded (no upstream fix)
- ✅ Compat matrix Java 25 + SB4 default not in matrix as separate job — still bounded (intentional, the regular unit-test job runs on Java 25 by default)
- ✅ Schedule trigger of compat-matrix-weekly creates 0-job pipeline via play API — still bounded (still in TASKS.md as investigation ; manual trigger button works as workaround)
- 🆕 NEW limitation observed today : local mvn verify -Dcompat -Djava21 on Mac arm64 fails with SB3/SB4 import path mismatch in target/merged-sources/test/ — see Known limitations section

- ⏭ N/A — no Spring AI / MCP code changes in this rev. 14 in-process MCP @Tool methods + Ollama local LLM + Spring AI 1.1.4 + gen_ai.* OTel spans → Tempo unchanged from stable-v1.2.23.

- Supply-chain hardening : 4 GitHub Actions SHA-pin bumps to current major lines :
  - ossf/scorecard-action 2.4.0 → 2.4.3 (Scorecard core 5.3.0 + token-permission hygiene)
  - actions/checkout v4 → v6.0.2 (Node 16 → 20 runtime, drops deprecated runtime)
  - actions/setup-java v4 → v5.2.0 (Node 16 → 20 transition)
  - github/codeql-action v3 → v4.35.2 (v3 deprecated by GitHub late 2025, v4 is supported line)
- AuthN/AuthZ surfaces unchanged : JWT HS256 + X-API-Key + OAuth2/OIDC (Auth0 prod / Keycloak dev) + RBAC + Bucket4j rate-limit + IdempotencyFilter + SecurityHeadersFilter
- CVE posture : grype + trivy + cosign + OWASP dependency-check all green on CI #1153 ; 10 HIGH/CRITICAL CVE baseline maintained with dated suppressions
- Defense-in-depth : 7 BLOCKER tests-without-assertion wrapped in assertThatNoException (from earlier session)
- SHA pinning policy enforced via Sonar githubactions:S7637 hotspot ; tj-actions/changed-files supply-chain incident (March 2025) blocked by SHA-pin discipline

- ⏭ N/A — no domain code change in this rev. Customer onboarding + enrichment + Order/Product/OrderLine + 6 invariants + jqwik property tests unchanged.

- Submodule infra/shared bumped to cd776c0 (34 commits forward, brings) :
  - ci(promote): auto-merge dev→main template
  - feat(budget): GCE quota pre-flight in budget.sh + up.sh (ADR-0065 follow-up)
  - docs(adr): 0065 GCE SSD_TOTAL_GB quota blocks Autopilot scale-up
  - fix(cluster): up.sh + up-fast.sh skip dangling argocd/application.yaml
  - docs(runbooks): 2026-04-29 RPO measurement (1 lost write)
- GKE production cluster iris-prod + Terraform modules unchanged
- Multi-cloud targets (AKS/EKS/Cloud Run/Fly.io) unchanged
- Ephemeral pattern (ADR-0022) unchanged

- ⏭ N/A — no OTel exporter / SLO / dashboard change in this rev. 3 SLOs as code (Sloth) + multi-burn-rate alerts + Apdex/heatmap dashboards + runbooks unchanged.

- 8+ Sonar mechanical sweeps cleared (~85 issues total across 2 sessions) :
  - S6068 — 7 useless eq() mockito matchers (surgical, NOT batch — preserves matcher mixing rules)
  - S5853 — 26 test classes annotated with @SuppressWarnings (multi-assertion chain refactor deferred)
  - S5838 — 14 test files migrated to AssertJ idioms
  - S125 — 17 classes suppressed (prose comments with code-like glyphs)
  - S7467 — 13 files suppressed (unnamed patterns Java 22+)
  - S1128 — 10 unused imports removed
  - S1192 + S3252 — 7 CRITICAL code_smells cleared
  - S1905 + S6213 — 8 mechanical code_smells cleared (twice — extracted as two MRs)
  - BLOCKER tests-without-assertion — 7 wrapped in assertThatNoException
  - S2583 + S5841 — 2 Java bugs cleared
- JaCoCo merged unit + IT coverage gate (70%) still met (CI #1153 green)
- SonarCloud quality gate green ; ~85 issues cleared, no new issues introduced
- Spectral OpenAPI 3.1 lint + hadolint + Checkstyle + SpotBugs + findsecbugs all green
- Mutation testing (PIT) gate intact

- GitHub Actions SHA-pinning : 4 actions bumped to current major lines via 2 MRs (!313 scorecard patch ; !314 batched 3 majors)
- Mirror sync : Dependabot PRs on iris7-app/iris-service-java#1-4 covered by GitLab MRs ; auto-close on next mirror push (Dependabot detects same SHAs landed)
- Preflight github-mirror-drift detection now part of bin/dev/stability-check.sh (!299) — flags when GitHub mirror has commits not on GitLab
- Conventional Commits + auto-merge dev to main intact
- GitHub Actions parallel CI on main pushes (ADR-0069 double-CI) intact
- Allow_failure shields documented per ADR-0049 (phase 2 — completes the audit)
- Compat-matrix-weekly schedule still under investigation (gitlab-org/gitlab#573307 adjacent symptom) — manual trigger workaround documented

- No new ADRs accepted this rev
- ADR-0066 through ADR-0071 NOW available via submodule infra/common bump (260c3d9) :
  - ADR-0066 → 0070 series (transitively, see iris-common log)
  - ADR-0071 pipeline variable override role policy
- Hexagonal Lite (ADR-0044) + Feature-slicing (ADR-0008) + polyrepo flat α (ADR-0060) unchanged
- Per-method MCP @Tool exposure (ADR-0062) unchanged

- ⏭ N/A — backend repo. iris-ui sibling untouched in this rev (1 docs-only commit unreleased, candidate for stable-v1.2.7 if cut).

- Stability-check sections layered : preflight (with new github-mirror drift gate) + infra audit + code audit + 23 individual section scripts (per ADR-0044 hexagonal slicing applied to bash)
- Submodule infra/common bumped to 260c3d9 (14 commits forward, brings) :
  - feat(ship): one-command github-mirror-sync.sh across all 5 repos
  - chore(shell): shellcheck warning backlog cleared + local severity bumped
  - docs(audit): marathon session 2026-05-14 handoff for resume continuity
- Docker hygiene cleaned (-7.6 GB) + 1 orphan kind cluster from 3 days ago purged
- Auto-merge dev→main template (via infra/shared bump) now available for all consumers

- Mac arm64 + Docker for Mac + GitLab Runner services architectural impasse — no upstream fix
- Compat matrix Java 25 + SB4 (the default) not in the matrix as a separate job — intentional, covered by default unit-test job
- compat-matrix-weekly schedule produces 0-job pipeline via play API — manual trigger button works ; root cause under investigation (gitlab-org/gitlab#573307 adjacent), still in TASKS.md
- 🆕 Local mvn verify -Dcompat -Djava21 fails on Mac arm64 with SB3/SB4 import mismatch in target/merged-sources/test/ — source-rewrite plugin places file at SB4 path but keeps SB3 import. CI compat-matrix uses different invocation (inline rules in .gitlab-ci/test.yml) and is unaffected. Exit ticket : track if Spring Boot 4 source-rewrite plugin gets a fix upstream, or document the local workaround command if found.
- 🆕 glab CLI auto-merge race after MR create : 405 Method Not Allowed for ~8s window after `glab mr create` — workaround `sleep 8 && glab mr merge --auto-merge` succeeds reliably. Documented in CLAUDE.md, no real action needed (transient API state).

- stable-v1.2.25 candidate after one of these lands :
  - compat-matrix-weekly schedule fix (gitlab-org/gitlab quirk root cause + workaround applied) — TASKS.md investigation item
  - First product domain extension lands (new MCP tool, new feature, etc.)
  - Native build pipeline end-to-end test (manual trigger today, scheduled future)
- Sibling tags candidate :
  - stable-py-v0.7.8 — 2 commits unreleased on iris-service-python including fix(deps): mutmut 3.x paths_to_mutate list format
  - stable-v1.2.7 on iris-ui — 1 docs-only commit (allow_failure deploys documentation), marginal value