---
id: T02
parent: S05
milestone: M014
provides: []
requires: []
affects: []
key_files: []
key_decisions: ["Stashed dirty working tree on ub01 before pulling — stash preserved for manual review"]
patterns_established: []
drill_down_paths: []
observability_surfaces: []
duration: ""
verification_result: "curl http://ub01:8096/ returned 200. curl http://ub01:8096/health returned 200. Docker build succeeded with 56 modules, 0 errors. JS bundle hash ROcEGTIv matches build output."
completed_at: 2026-04-03T01:46:15.290Z
blocker_discovered: false
---

# T02: Deployed v2-aware frontend to ub01 and verified production site loads with HTTP 200, healthy API, and correct JS bundle hash

> Deployed v2-aware frontend to ub01 and verified production site loads with HTTP 200, healthy API, and correct JS bundle hash

## What Happened
---
id: T02
parent: S05
milestone: M014
key_files:
  - (none)
key_decisions:
  - Stashed dirty working tree on ub01 before pulling — stash preserved for manual review
duration: ""
verification_result: passed
completed_at: 2026-04-03T01:46:15.290Z
blocker_discovered: false
---

# T02: Deployed v2-aware frontend to ub01 and verified production site loads with HTTP 200, healthy API, and correct JS bundle hash

**Deployed v2-aware frontend to ub01 and verified production site loads with HTTP 200, healthy API, and correct JS bundle hash**

## What Happened

Pushed 11 local commits to origin/main. On ub01, stashed dirty working tree (local backend edits) and cleaned untracked migration file, then fast-forwarded. Built chrysopedia-web container: Vite produced 56 modules with no errors. Recreated container and verified site returns HTTP 200, health endpoint healthy, API reachable through nginx proxy, and served JS bundle hash matches build output.

## Verification

curl http://ub01:8096/ returned 200. curl http://ub01:8096/health returned 200. Docker build succeeded with 56 modules, 0 errors. JS bundle hash ROcEGTIv matches build output.

## Verification Evidence

| # | Command | Exit Code | Verdict | Duration |
|---|---------|-----------|---------|----------|
| 1 | `docker compose build chrysopedia-web` | 0 | ✅ pass | 7600ms |
| 2 | `docker compose up -d chrysopedia-web` | 0 | ✅ pass | 3000ms |
| 3 | `curl -s -o /dev/null -w '%{http_code}' http://ub01:8096/` | 0 | ✅ pass (200) | 500ms |
| 4 | `curl -s -o /dev/null -w '%{http_code}' http://ub01:8096/health` | 0 | ✅ pass (200) | 500ms |


## Deviations

Service name is chrysopedia-web not chrysopedia-web-8096. Had to stash dirty ub01 working tree before pull.

## Known Issues

ub01 has a stashed git state with local backend edits that should be reviewed.

## Files Created/Modified

None.


## Deviations
Service name is chrysopedia-web not chrysopedia-web-8096. Had to stash dirty ub01 working tree before pull.

## Known Issues
ub01 has a stashed git state with local backend edits that should be reviewed.
