Build an accessible page, measure its cost, and prove the deployed read path. The deliverable is a working local implementation and a written trace of its boundary decisions. The trace should state what request was made, which layer accepted or rejected it, and what the user saw. This keeps the review tied to behavior instead of the amount of framework code produced.
Project: ship a case page with measured release gates
Build the readable page
Render the case title, status, and primary navigation in the initial HTML. Use a stable image box with useful alt text if a photograph conveys case information. Let a deferred script enhance one action while leaving the case record readable if that script fails. Keep request URLs relative to the application and distinguish a missing case from a failed connection. Establish a compact and wide layout that preserve reading order and keyboard focus order.
Measure the user cost
Capture a baseline for the first meaningful content, image transfer size, layout movement, and response to an interaction on a mobile-sized viewport. Set a budget before changing code. If the image dominates transfer, resize or encode it for its displayed use. If a handler scans every case on each keypress, reduce that work or move it away from the input path. Repeat the same measurement after the change. Record the environment so the comparison is meaningful rather than presenting one score without context.
Release and rollback
Create a read-only smoke check for the case page and its API. Verify status, content type, and a case-specific landmark. Run it immediately after deployment and stop rollout if it fails. Identify the previous application version and verify that it can still read the current stored data before the deploy. A migration that removes a field used by that version requires a compatibility stage. Record who can trigger rollback and what evidence starts it. Keep the release note focused on observed behavior and unresolved risk.
Acceptance contract
Release gate for case 47
Page: GET /cases/47 -> 200, text/html, heading includes "Case 47"
API: GET /api/cases/47 -> 200, expected JSON shape
Keyboard: primary action reachable and named
Visual: image dimensions reserve its layout box
Rollback: previous version can read current case recordCommon Mistakes
- Do not equate a successful build with a working deployed route.
- Do not quote an unrepeatable performance number as a release result.
- Do not roll back code without checking data compatibility.
Related lessons
Page loading: keep content available while CSS and scripts arrive; Page performance: budget the critical path and reserve layout space; Release checks: prove the critical route and prepare a rollback; Responsive CSS: keep reading order and controls usable.
Harder boundary
Include an old-binary compatibility drill in staging before declaring rollback ready. A code rollback cannot repair a schema change that already removed a column the old binary needs. Restore a backup into isolation as a separate drill, compare selected records and media, and record the actual data age and recovery time. A green build alone proves neither direct-route behavior nor recoverability.
Extend the build
Continue with Project: release and recovery drill for a content service.
