Created
Jun 26, 20:28
Started
Jun 26, 20:34
Completed
Jun 26, 23:21
DevOps handoff
Type
Feature
Shape
ui+db
Worktree Slug
production-smoke-seal-agent
Repositories
mcritchie-studio
Release Train
—
Branch
feat/production-smoke-seal-agent
Acceptance Criteria
Expected Test Plan
Checks Run
Agent Context
Post-deploy production smoke SEAL OF APPROVAL, born from the 2026-06-26 QA-release audit. GAP it fixes: config/devops_test_suites.yml declares a production_smoke lane with command 'bin/prod-smoke <app>' but that script DOES NOT EXIST; today the only prod verification at ship is a single 'curl GET <smoke_url>/up' 200 check in bin/release (~line 1375). DESIGN (operator-aligned 2026-06-26): (1) Floor = implement bin/prod-smoke <app> reusing the EXISTING read-only Playwright spec e2e/qa_readonly.spec.js (@qa-readonly: home/signin/tasks render + /up 200 + /devops & /devops/cycle 404) but pointed at the app's PRODUCTION url instead of QA. Read-only by construction: no content creation, no emails, no provider-state change. (2) Trigger = post-ship, AFTER bin/release ship deploys and the existing /up hard-gate passes (prod live). It is a SEAL, not a gate — the ship already happened. (3) Scope = GENERIC HEALTH ONLY (operator choice) — do NOT read shipped members' acceptance criteria or deep-probe; the @qa-readonly suite is the verification. (4) Seal recorded in ALL THREE: a 🟢/🔴 badge on the release in /deployments + persisted on the Release record (new column e.g. smoke_seal{status,summary,checked_at}); Discord (release-notes thread); and appended to the auto-posted release notes body. (5) On FAILURE: record red seal, ALERT the operator, and surface the exact rollback/revert command (Release#abandon! / git revert -m1 of the merge on release) — but DO NOT auto-rollback; operator stays the gate. HOST NUANCE to resolve: config production_url is https://mcritchie.studio but the ship adapter smoke_url is https://app.mcritchie.studio — confirm canonical prod host for the suite base URL. Reuse Release::Conductor.post_release_notes / the Discord Formatter path. Shape ui+db because the seal persists (DB) and renders a board badge (UI); dor_tiers = unit, component, integration, e2e. Relates to two other audit findings (out of scope here, file separately): the two divergent tier vocabularies (feature_shapes dor_tiers vs Release::STEP_TEST_TIERS), and tier tags being agent-asserted strings rather than machine-credited.
Stage Timeline
Who handled each stage, the time it took (measured), and the model / tokens / cost reported (best-effort) — plus who's on it right now. — means the agent didn't report that metric.
Conversation
QA review feedback, agent handoffs, and follow-up notes for this task.
Senior review -> APPROVED (2/2). Reviewers: Carl (backend/migration heavy) + Alex (release-semantics/docs light), both high confidence. Confirmed the EXISTING SHIP FLOW IS SAFE: seal is a post-/up-gate step 5c, read-only against prod, strictly NON-BLOCKING (no new abort/rollback path; board write rescued); migration purely additive (jsonb, schema matches, no backfill); 149 focused tests green. Follow-ups (non-blocking): (1) minor bin/release line ~1474 -- the bin/prod-smoke spawn (Open3) sits OUTSIDE the degrade-to-warn rescue; a narrow env failure (non-exec / wrong CWD) could propagate between deploy and ship!/notes, leaving a release stuck assembled with no notes -- wrap the sh call; (2) medium: docs devops-cycle-design section 1.4 Run Deployment prose not updated for the new seal/badge step (AGENTS.md docs-in-same-pass); add ~2 sentences; (3) low: devops_test_suites.yml production_url comment overstates its role (host actually resolves from release_repos smoke_url). -> reviewed.
Sealed-bid sizing
Edit →Alex (PM)
—
Avi (PO)
LARGE
Dev
LARGE
Actual
XL
We emailed a one-tap sign-in link to . It expires shortly and can only be used once.
No email? Check spam, or close this and try again.