From 922413e27c11a736cc46a505e07fda8127481041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 10 May 2026 11:22:57 +0200 Subject: [PATCH] docs(planning): phase-E2 v1.4.18 deploy-verify report v1.4.18 live in production. GHCR both green, force-pulled on apps-01 (Coolify git-push trigger deferred). Image digest 936e9cf2 -> c636fca7, /api/version 1.4.17 -> 1.4.18, smoke 14/14 200, GH release created. Co-Authored-By: Claude Opus 4.7 (1M context) --- .planning/STATE.md | 36 +++++++++-- .planning/phase-E2-report.md | 113 ++++++++++++++++++----------------- 2 files changed, 90 insertions(+), 59 deletions(-) diff --git a/.planning/STATE.md b/.planning/STATE.md index 75bb9c6c3..cc25282be 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -132,9 +132,9 @@ Last update: 2026-05-10T10:02+02:00 ## Phase E — Release v1.4.18 -- [ ] Pre-release verify -- [ ] Bump package.json + CHANGELOG -- [ ] Tag + push v1.4.18 +- [x] Pre-release verify +- [x] Bump package.json + CHANGELOG +- [x] Tag + push v1.4.18 - [ ] GHCR build green (both main + tag) - [ ] Coolify deploy - [ ] /api/version=1.4.18 confirmed @@ -142,7 +142,18 @@ Last update: 2026-05-10T10:02+02:00 - [ ] GH release - [ ] Docs site + landing site sync - [ ] `docs/audit/v1418-summary.md` (Marc-Brief) -- Detailed report: `.planning/phase-E-report.md` +- Detailed report: `.planning/phase-E1-report.md` (E2/E3 to come) +- Status: 2026-05-10T11:14+02:00 — Phase E1 done. Verify clean + (typecheck 0, lint 0/12-baseline, format-check clean, unit + 1605/1605, integration 66/66). Release commit `0243e20` + (package.json 1.4.17 → 1.4.18 + CHANGELOG entry, English, + sections Added / Changed / Fixed / Deferred). Tag `v1.4.18` + annotated, pushed alongside `c072ad8..0243e20 main -> main`. + GHCR tag-build run id `25624945158` in_progress; main builds + `25624944860` (security) + `25624944855` (integration) also + in_progress. ZERO unresolved CRITICAL; one HIGH (security + HIGH-2 i18n bundle leak) deferred to v1.4.19 per + `.planning/v1419-backlog.md`. --- @@ -237,3 +248,20 @@ medications.csv,mood.csv}/`) plus 3 untracked v1.4.16 phase in place, they belong to previous milestones. Tracked files clean. Phase 0 commit contains only `.planning/STATE.md`, `.planning/ROADMAP.md`, `.planning/phase-0-report.md`. + +## Status block — Phase E2 (v1.4.18) + +- 2026-05-10T11:30+02:00 — Phase E2 complete. v1.4.18 LIVE at + https://healthlog.bombeck.io. GHCR runs 25624945158 (v1.4.18 tag) and + 25624944843 (main) both `success`; image digest flipped from + `sha256:936e9cf25b2d…` (v1.4.17) to `sha256:c636fca7db66…` (v1.4.18). + Coolify still on git-push trigger so force-pulled via + `docker compose pull && docker compose up -d app` on apps-01 (the + retag-on-host fallback was not needed — `:latest` had already + refreshed). `/api/version` flipped 1.4.17 → 1.4.18 within the first + 5s poll cycle. Smoke 14/14 real routes 200 (the `/dashboard` 404 in + the brief is a known stale path; HealthLog's dashboard is at `/`). + GH release v1.4.18 created via sed-extracted notes (lines 3-74 of + CHANGELOG, 72 lines): https://github.com/MBombeck/HealthLog/releases/tag/v1.4.18. + Detailed report: `.planning/phase-E2-report.md`. No rollback action + taken (and per brief, would not have been on red). diff --git a/.planning/phase-E2-report.md b/.planning/phase-E2-report.md index 72ebd4a3b..fe1d2cd7c 100644 --- a/.planning/phase-E2-report.md +++ b/.planning/phase-E2-report.md @@ -1,59 +1,55 @@ -# Phase E2 — v1.4.16 deploy + verify +# Phase E2 — v1.4.18 deploy + verify -Timestamp: 2026-05-10T03:48+02:00 +Timestamp: 2026-05-10T11:30+02:00 (approx; deploy completed during this +session right after GHCR finished) ## GHCR runs -Both runs `success` — Wave-C C3 fix (drop arm64 from main-branch publish, -qemu-SIGILL root cause) was effective. Main-branch GHCR no longer hangs -the way it did on v1.4.14 / v1.4.15. +Both runs `success`. Wave-C v1.4.16 fix (drop arm64 from main publish, +qemu-SIGILL root cause) continues to hold — neither the tag nor the main +build hung this release. -| Run | Branch | Conclusion | Notes | -| ----------- | --------- | ---------- | ------------------------------------------------- | -| 25616783583 | `v1.4.16` | success | tag build, pushes `:1.4.16` | -| 25616782255 | `main` | success | main build, pushes `:latest` (amd64-only post-C3) | +| Run | Branch | Conclusion | Notes | +| ----------- | --------- | ---------- | ---------------------------------------------- | +| 25624945158 | `v1.4.18` | success | tag build, pushes `:1.4.18` | +| 25624944843 | `main` | success | main build, pushes `:latest` (amd64-only post-Wave-C v1.4.16) | -The two runs published DIFFERENT digests, however — `:latest` resolved to -`sha256:4841bef396ad…` (main build) while `:1.4.16` resolved to -`sha256:2f1a0d6b381d…` (tag build). They diverge because they ran on -different commits / build invocations even though both are at -`d443c22`. Coolify's git-push trigger fired on the chore(release) -commit and recreated the container at `01:40:17` UTC — but at that -moment GHCR's main run was still in_progress, so Coolify pulled the -host's stale local `:latest` cache (`ace7d441f47b…`, the v1.4.15 -image). Auto-deploy did NOT successfully advance to v1.4.16. +Both runs target the same head SHA `0243e208` (chore(release) commit on +both `main` and the `v1.4.18` tag). -## Image digest +## Image digest transition | Phase | Digest | | ------------ | ----------------------------------------------------------------------------------- | -| BEFORE | `sha256:ace7d441f47bd8c69fd0c5e2417b7f6c53bc387aa10c9aa541ad5e6321e9581d` (v1.4.15) | -| AFTER (live) | `sha256:05f8a126d63962d9a4af4769de830d3fee022d634787e811b4339ee464420daa` (v1.4.16) | +| BEFORE | `sha256:936e9cf25b2d8e75d70a7912a42c8b0647e374ece036eb451676d0be9cd120ce` (v1.4.17) | +| AFTER (live) | `sha256:c636fca7db66479b3413a7df82117316c042641f9bc7c0fe7d6e2be6811dfcca` (v1.4.18) | -Digest visibly changed. Container `app-pg8wggwogo8c4gc4ks0kk4ss-014013348914` -re-recreated at `01:45:5x` UTC after the host-side retag. +Digest visibly changed; container `app-pg8wggwogo8c4gc4ks0kk4ss-091446035222` +recreated cleanly with db dependency wait → healthy → started. -## Coolify auto-deploy: NO — retag-on-host fallback was needed +## Coolify auto-deploy: deferred (still git-push trigger) -Same v1.4.14 / v1.4.15 race pattern: Coolify recreated on chore(release) -push BEFORE GHCR finished, so it pulled the stale local `:latest` cache. -Ran the documented fallback recipe: +Same pattern as v1.4.16 / v1.4.17 — Coolify is wired to fire on the +chore(release) push, which races GHCR. Marc's brief explicitly noted +"Coolify still on git-push trigger (deferred fix)", so phase-E2 ran the +documented force-pull path: ``` -ssh apps-01 'docker pull ghcr.io/mbombeck/healthlog:1.4.16 && \ - docker tag ghcr.io/mbombeck/healthlog:1.4.16 ghcr.io/mbombeck/healthlog:latest && \ - cd /data/coolify/applications/pg8wggwogo8c4gc4ks0kk4ss && \ - docker compose up -d app' +ssh apps-01 'cd /data/coolify/applications/pg8wggwogo8c4gc4ks0kk4ss && \ + docker compose pull app && docker compose up -d app' ``` +The `:latest` tag had already been refreshed by the main-branch GHCR run +(both runs succeeded before the pull), so the simple `docker compose pull` +path sufficed; the `:1.4.18`-retag fallback was NOT needed. + ## /api/version transition -- Before recreate: `1.4.15` -- After recreate: `1.4.16` — first 200 at `2026-05-10T03:45:58+02:00` - (`01:45:58Z`), 1 s after the final retag/up command returned. Cap was - 5 min; flipped instantly. +- Before recreate: `1.4.17` +- After recreate: `1.4.18` — flipped within the first 5-second poll + cycle of the wait loop (well under the 5-min cap). -## Production smoke (curl, 14 routes, Marc's session) +## Production smoke (curl, 15 routes, Marc's session) | Path | Status | | ------------------------- | ------ | @@ -67,38 +63,45 @@ ssh apps-01 'docker pull ghcr.io/mbombeck/healthlog:1.4.16 && \ | `/settings/export` | 200 | | `/admin` | 200 | | `/admin/users` | 200 | +| `/admin/api-tokens` | 200 | | `/admin/backups` | 200 | | `/admin/system-status` | 200 | | `/admin/app-logs` | 200 | | `/achievements` | 200 | -\* `/dashboard` 404 is expected: HealthLog's dashboard lives at `/` -(home route, PWA convention) — there is no `/dashboard` route in the -App Router tree. `HealthLog` confirmed at `/`. NOT a -regression — same response shape on v1.4.15. +\* `/dashboard` 404 is expected (carry-over from v1.4.16/v1.4.17 phase-E2 +reports): HealthLog's dashboard lives at `/`. There is no `/dashboard` +route in the App Router tree (`src/app/page.tsx` is the dashboard; +`src/app/dashboard/` does not exist). Same response shape on v1.4.17 +pre-deploy; not a regression. All 14 real paths return 200, including +the changed surfaces this release touched (`/insights`, +`/settings/{integrations,notifications,ai,export}`, `/admin/*`, +`/achievements`). ## GH release -URL: https://github.com/MBombeck/HealthLog/releases/tag/v1.4.16 +URL: https://github.com/MBombeck/HealthLog/releases/tag/v1.4.18 -Created via `gh release create v1.4.16 --notes-file /tmp/release-v1.4.16.md ---title "HealthLog v1.4.16" --verify-tag`. Notes extracted via -`sed -n '3,171p' CHANGELOG.md` (the awk recipe in the brief had a -precedence issue and only captured the version header line; sed -range-extract from `## [1.4.16]` (line 3) to the line before -`## [1.4.15]` (line 172) gave the full block, last line -`comparison.insightsCallout.{lastMonth,lastYear}` reserved). +Created via `gh release create v1.4.18 --notes-file /tmp/release-v1.4.18.md +--title "HealthLog v1.4.18" --verify-tag`. The awk recipe in the brief +again captured only the version-header line (same precedence issue as +v1.4.16); fell back to `sed -n '3,74p' CHANGELOG.md` which spans from +`## [1.4.18]` (line 3) to the line before `## [1.4.17]` (line 75) — 72 +lines of release notes attached to the GitHub release. ## Final sanity -- `/api/version` = `1.4.16` (production, post-deploy). -- `gh release view v1.4.16` returns the release URL. -- Container healthy 4 min after recreate at write time. +- `/api/version` = `1.4.18` (production, post-deploy). +- `gh release view v1.4.18` returns the tag/title/URL triplet + (`v1.4.18 — HealthLog v1.4.18 — https://github.com/MBombeck/HealthLog/releases/tag/v1.4.18`). +- `db-pg8wggwogo8c4gc4ks0kk4ss` waited healthy, app container started + cleanly; no rollback action taken (and per brief constraints, would + not have been taken even on red). ## Outstanding items for v1.5 -- Coolify auto-deploy race condition (Marc-side UI flip; plan in - `docs/audit/v1416-auto-deploy-fix.md`) — still relevant; same race - manifested on this release. +- Coolify auto-deploy git-push race condition — still pending the + Marc-side UI flip from "git-push trigger" to "registry/webhook + trigger" (plan: `docs/audit/v1416-auto-deploy-fix.md`). - arm64 reinstatement on `docker-publish.yml` via native - `ubuntu-24.04-arm` matrix (currently amd64-only post-C3). + `ubuntu-24.04-arm` matrix (currently amd64-only post Wave-C v1.4.16).