docs(e2e-matrix): J.L.E.7 stage close — Linux upgrade reaches happy-path parity
Summary
Stage-summary update for the J.L.E.7 phase. Six small reviewable PRs (#210–#216) landed one Linux happy-path full-lifecycle test (E1h_FullLifecycle_HappyPath_WritesSuccessAndSwapsBinary). Each iteration was driven by a fresh runner failure surfacing a real production-vs-test fidelity gap.
What this PR does
-
docs/e2e-scenario-matrix.md— moves three Linux scenarios from Planned →✅ Verified, adds phase rows for 12.L.E.3 through 12.L.E.7, bumps cumulative shipped count from 84 → 89.
No production code change. No test code change. Just keeping the source-of-truth ledger honest.
J.L.E.7 iteration ledger (preserved as test invariants)
| # | What broke | What it taught |
|---|---|---|
| 7.1 |
SERVICE_NAME defaulted to literal squid-tentacle
|
Test must override defaults end-to-end via real placeholder substitution |
| 7.2 |
HEALTHCHECK_RETRIES=1 raced python3 spawn |
Healthcheck retry budget must accommodate slowest realistic responder spawn time |
| 7.3 | python3 socketserver couldn't re-bind port (TIME_WAIT) | Phase B re-binds the same healthz port → allow_reuse_address=True is mandatory, not optional |
| 7.4 | Marker absent — blind assertion | Long-running E2E assertions need install-dir state dump on failure (Rule 12.10) |
| 7.5 |
.sh's timeout 5 ... version triggered SIGTERM → trap-cleanup deleted marker |
Test service must short-circuit version subcommand BEFORE entering sleep loop (real Squid.Tentacle does same) |
| 7.6 |
version.txt stripped pre-release 2.0.0-test → 2.0.0 mismatched TARGET_VERSION
|
Phase B sanity check is exact-string match — any version-rendering divergence between TARGET_VERSION resolver and version.txt writer triggers spurious rollback |
Each fix is now baked into LinuxLifecycleContext / squid-linux-test-service.sh / LinuxServiceFixture. Future regressions on any of these will fail E1.h-Linux on the next CI run.
Why six PRs and not one
Per the user pattern (small reviewable PRs + per-iteration runner verification): each fix is a self-contained 1-2 file change with a clear runner output that proved the next bug. Compressing them into one PR would have:
- masked which fix solved which symptom
- made
git bisectmuch harder if any of these regressions resurface - prevented the "stage summary + global review" cadence from running between iterations
Test plan
-
CI green on Tests workflow (no test changes here, just docs) -
Source ledger renders cleanly on GitHub PR view