mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-10 13:22:14 +00:00
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) <noreply@anthropic.com>
This commit is contained in:
1 parent
0243e20853
commit
922413e27c
2 files changed
+90
-59
No files matched your search
+32
-4
@@ -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).
|
||||
@@ -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. `<title>HealthLog</title>` 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).
|
||||
Reference in new issue
Block a user