---
created: 2026-05-16T23:55:00Z
title: Split Playwright smoke into 3rd workflow job (deploy-staging.yml)
area: ci
files:
  - .github/workflows/deploy-staging.yml
source: 06.5 UAT operator-suggested follow-up
---

## Problem

`deploy-staging.yml` `full-path` job runs `build → deploy → Playwright smoke` serially.
`gh run watch` observers waiting on deploy completion cannot distinguish between
"deploy succeeded but smoke failed" and "deploy failed" without parsing per-step
conclusions. The 06.4 D-51c/CLI-08 carry-over has a known Playwright failure mode
that makes the run exit non-zero even though the deploy itself is healthy.

During Phase 06.5 UAT (2026-05-16), this coupling caused:
- Two run-watch loops effectively forced a full-cycle wait because the Playwright
  step continued after deploy completion.
- Operator-side decision-making had to manually inspect per-job conclusions
  (`gh run view --json jobs`) to confirm the deploy itself succeeded.

## Proposal

Split `full-path` into two jobs:

1. **`full-path-deploy`** — `build → image push → flyctl deploy`. Exits success
   the moment Fly machine reports `1/1 healthy`. Observable / waitable independently.

2. **`full-path-smoke`** — `needs: [full-path-deploy]` — Playwright CLI-08 smoke
   + upload-on-failure artifacts. Runs only after deploy is green. Failure here
   does not block downstream automation that only depends on deploy.

The existing `[skip-staging-smoke]` commit-msg flag and `workflow_dispatch` input
should both apply to the new `full-path-smoke` job's `if:` condition (verified
working in Phase 06.5 Drill 5 — flags propagate via env).

## Acceptance

- [ ] `gh run watch <id>` exits success when deploy succeeds even if smoke later fails.
- [ ] Per-job conclusions: deploy can be `success` while smoke is `failure`; overall
  run conclusion driven by `full-path-smoke` failure as today.
- [ ] `[skip-staging-smoke]` and `inputs.skip_smoke` continue to skip the smoke job
  cleanly (regression-test via workflow_dispatch).
- [ ] No behavior change for callers that DO check the overall run conclusion.

## Out of scope (defer to a future workflow-polish phase)

- Promoting smoke failures to non-blocking advisory only.
- Adding similar split to `deploy-prod.yml` (when it exists).
- Migrating actions/checkout@v4 + dorny/paths-filter to Node 24 (separate deprecation TODO).
