# Gate Push

> Single-verb branch-to-PR quality gate pipeline. Use when the user wants to gate, push, and open a PR for a branch in one command.

- Skill: `jamie-bitflight/gate-push` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jamie-bitflight/gate-push`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jamie-bitflight/gate-push/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: Jamie-BitFlight (https://skillmd.com/u/jamie-bitflight)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/jamie-bitflight/gate-push

---


# Gate Push

Run `/dh:gate-push <branch-name>` to resolve branch context into a `/dh:complete-implementation` input and execute that quality-gate pipeline.

## Required input

- `branch_name = $ARGUMENTS` (must be non-empty)

If empty: stop with:

```text
COMPLETION BLOCKED — Missing required argument <branch-name>.

Then re-run:
/dh:gate-push <branch-name>
```

## Branch → backlog lookup algorithm

1. Normalize `branch_name` into a lookup slug:
   - Strip leading branch type prefix when present (`feature/`, `fix/`, `chore/`, etc.) by removing only the prefix up to and including the first `/` character
   - Then replace any remaining `/`, `_`, and `-` with spaces (for example `feature/auth/login-fix` → `auth login fix`)
   - Trim whitespace
   - Store the result as `normalized_slug`
   - Expected pattern is `type/slug` (e.g., `feature/foo-bar`); multi-segment branches (`type/segment1/segment2`) are supported and normalize with the same replacement rule
2. Strategy 1 (title match):
   - `uv run "${CLAUDE_PLUGIN_ROOT}/sam_schema/cli.py" backlog list --title "<normalized_slug>"`
3. Strategy 2 (topic match fallback, only if Strategy 1 has zero results):
   - `uv run "${CLAUDE_PLUGIN_ROOT}/sam_schema/cli.py" backlog list --topic "<normalized_slug>"`
4. If exactly one item is returned, use it as `match`.
5. If multiple items are returned, do not guess — stop and follow the No-match / unresolved fallback procedure below.

## Resolve complete-implementation input

From `match`, resolve in this order:

1. If `match.issue` exists (issue number field from backlog output) → `target = #<match.issue>`
2. Else if `match.plan` exists and non-empty → `target = <match.plan>` (use the backlog item's plan field directly)
3. Else no resolvable target

## Execute gate pipeline

If `target` is resolved:

```text
Skill(skill: "dh:complete-implementation", args: "<target>")
```

`/dh:complete-implementation` is the source of truth for the quality-gate phases and final push/PR behavior. Do not duplicate its gate logic here.

## No-match / unresolved fallback

If no backlog match is found, a match exists but has neither `issue` nor `plan`, or multiple matches are found:

- Do not prompt mid-loop.
- Stop with:

```text
COMPLETION BLOCKED — Branch cannot be resolved to a single backlog issue/plan.

Required precondition:
- Ensure branch-to-backlog mapping is decided at workflow start (for example via `/dh:work-backlog-item --auto ...`) or at the start of `/dh:implement-feature`.
- Ensure the matched backlog item has either an issue number or a linked plan.

Then re-run:
/dh:gate-push <branch-name>
```

## Success check

After successful completion, verify PR visibility for the branch.

**GitHub backend only** — this step requires a GitHub remote configured with the `gh` CLI.
For beads and other non-GitHub backends, skip this step and verify via your backend's native
tooling (e.g., `bd show <issue-id>` for merge-request state).

```bash
if gh repo view --json name >/dev/null 2>&1; then
  gh pr list --head <branch-name>
else
  echo "Remote is not a GitHub repository — PR visibility check not applicable for this backend."
fi
```

Use the original input branch (`branch_name`), not `normalized_slug`, for `--head`.

