WCAG 2.1 AA audit — perceivable, operable, understandable, robust criteria. Deep-dive for /launch-check accessibility.
日本語の概要は準備中です。原文の説明を表示しています。
Record per-PR design-review approval (UI merge gate). ONLY on an explicit per-PR designer "approved".
日本語の概要は準備中です。原文の説明を表示しています。
実行スコア 未検証
インストール方法を見るインストールする前に、エージェントに与えられる指示の中身を確認できます。
Writing: read docs/skills/shared/writing-rule.md before you write a durable artifact.
Writes .claude/session/reviews/<owner>__<repo>__<pr>-design.approved (repo-qualified path, see AgDR-0060) with the current HEAD SHA so the require-design-review-for-ui.sh merge-gate hook will let a UI PR through. Without this marker, the hook blocks merges on any PR that touches a UI file — the pattern list lives in .claude/hooks/_lib-ui-paths.sh (React/Vue/Svelte/Astro/MDX components, template-engine files, styles, and design tokens), shared with step 5 below so the two checks never diverge (me2resh/apexyard#1390).
This skill is the design-review analog of /approve-merge (which writes the CEO marker for the merge gate). Same pattern, different gate.
INVOKE THIS SKILL ONLY ON EXPLICIT, PER-PR, DESIGN-REVIEW APPROVAL.
The valid invocation triggers look like this:
Invalid triggers (do NOT run this skill):
/approve-merge.If in doubt: STOP AND ASK. "PR #X has UI changes — has the design been reviewed and approved?" is one message. Merging a PR with incorrect UI that needs a follow-up revert is much worse.
The typed command stays. The operator can also approve the design review from a menu.
Show one AskUserQuestion menu. The question text must be exact.
Approve design review for <owner>/<repo>#<N> at <40-hex-sha>?
Use the PR base repo, the PR number, and the full head SHA from the forge. The SHA is 40 lowercase hex digits.
Offer these options and no others.
Approve design reviewNot yetDo not add a suffix to either label. The hook matches the label exactly.
record-menu-approval.sh reads the harness payload. It writes the menu record when the selected option is Approve design review. Do not write the marker yourself.
Not yet writes nothing.
An umbrella "go" does not count. A prose answer does not count. Any answer outside this menu does not count.
The typed command still writes a bare SHA. The menu record uses skill_version=3 and approval_channel=menu. The gate accepts both. It still requires the recorded SHA to match the PR head.
See AgDR-0234.
Extract the PR number from $ARGUMENTS. If no argument is given, try to infer from:
gh pr view --json number --jq '.number'If the PR number is ambiguous, STOP and ask.
Also resolve the repo (REPO). Accept the fully-qualified owner/repo#N form, or an explicit owner/repo second token. In split-portfolio v2 the PR lives in a sibling repo, so a bare gh pr view <pr> resolved against the ops-fork cwd hits the WRONG repo — the marker would then be written under the ops-fork qualifier and the require-design-review-for-ui.sh gate (which keys on the PR's real repo, derived from the merge command's cd-target, me2resh/apexyard#687) would never find it → false-block. Pass --repo "$REPO" to every gh pr view call below when REPO is known. Fail loud: if only a bare number was given and gh pr view <pr> cannot resolve the PR from the current cwd, STOP and ask for the owner/repo#N form — never write the marker under a guessed qualifier.
Before writing the marker, re-read the user's most recent message. Ask yourself:
If any of these are unclear — STOP. Reply with a per-PR explicit question:
"PR #X touches UI files (.tsx/.css/etc). Has the design review been completed on the actual PR diff — approved?"
Run gh pr view <pr> ${REPO:+--repo "$REPO"} --json state,isDraft,mergeable. Sanity checks:
state must be OPEN.MERGED, CLOSED, or DRAFT.mergeable should be MERGEABLE or UNKNOWN.Design review is a stamp on top of a Rex-approved HEAD, not parallel to code review. Resolve the ops fork root and source the marker path helper:
REPO_ROOT=$(git rev-parse --show-toplevel)
# Ops root: pin first, then walk up (docs/skills/shared/ops-root.md).
OPS_ROOT=$(p="${APEXYARD_OPS_PIN_DIR:-$HOME/.claude/apexyard}/ops-root-${CLAUDE_CODE_SESSION_ID:-}"; r=""; [ -z "${APEXYARD_OPS_DISABLE_PIN:-}" ] && [ -f "$p" ] && IFS= read -r r < "$p"; [ -f "$r/.claude/hooks/_lib-ops-root.sh" ] || { r="$PWD"; while [ -n "$r" ] && [ ! -f "$r/.claude/hooks/_lib-ops-root.sh" ]; do r=${r%/*}; done; }; [ -f "$r/.claude/hooks/_lib-ops-root.sh" ] && . "$r/.claude/hooks/_lib-ops-root.sh" && resolve_ops_root) || OPS_ROOT=""
MARKER_HOME="${OPS_ROOT:-$REPO_ROOT}"
# shellcheck source=/dev/null
. "$MARKER_HOME/.claude/hooks/_lib-review-markers.sh"
# Base (host) repo — the canonical marker key: it matches Rex's marker AND the
# merge gate's lookup (which keys on the merge command's base repo, #765). Prefer
# the repo resolved in step 1 (already the base, #687); if it wasn't given, fall
# back to the CURRENT checkout's own remote — a deterministic, non-ambient
# source of truth. Do NOT fall back to an unscoped
# `gh pr view <pr> --json headRepository`: that call reads the wrong field (the
# PR's head/fork) and is itself an ambient-resolved gh query that can silently
# prefer the wrong repo in a fork checkout (#887). pr_base_repo now REQUIRES
# this repo and scopes its own gh query to it — never gh's ambient default —
# so same-repo PRs still resolve unchanged.
if [ -n "$REPO" ]; then
REPO_FOR_BASE="$REPO"
else
origin_url=$(git remote get-url origin 2>/dev/null)
origin_url="${origin_url%.git}"
REPO_FOR_BASE=$(printf '%s' "$origin_url" | sed -E 's#^(https?://[^/]+/|git@[^:]+:)##')
fi
PR_HOST_REPO=$(pr_base_repo <pr> "$REPO_FOR_BASE")
PR_REPO="$PR_HOST_REPO"
REX=$(review_marker_path "$PR_HOST_REPO" <pr> rex "$MARKER_HOME")
[ -f "$REX" ] && [ "$(tr -d '[:space:]' < "$REX")" = "$(git rev-parse HEAD)" ]
If Rex's marker is missing or its SHA doesn't match HEAD, refuse and tell the user to re-invoke the code-reviewer first. Do not write the design marker on a stale base.
Check whether the PR's diff includes files that would trigger the design-review gate. If the PR has NO UI files, the marker is unnecessary — tell the user and skip.
Read the pattern list from _lib-ui-paths.sh — the same source require-design-review-for-ui.sh reads — instead of a separate hard-coded copy. The two lists drifted apart before this (me2resh/apexyard#1390); sourcing the shared library keeps them in sync going forward:
# MARKER_HOME and REPO_ROOT already resolved in step 4. Source the library
# from MARKER_HOME (the hook scripts live in the ops fork), but pass
# REPO_ROOT — the PR's own git root — to look up `.ui_paths`. That is the
# same root require-design-review-for-ui.sh reads. Passing MARKER_HOME here
# instead reads the wrong project-config.json inside a workspace/ clone,
# so a project-level `.ui_paths` override could make this check and the
# gate disagree (me2resh/apexyard#1397).
. "$MARKER_HOME/.claude/hooks/_lib-ui-paths.sh"
UI_GLOB_PATTERN=$(ui_effective_globs_pipe "$REPO_ROOT")
gh pr diff <pr> --name-only | grep -qE "$UI_GLOB_PATTERN"
Use the repo-qualified path via _lib-review-markers.sh (already sourced in step 4):
# (MARKER_HOME and PR_HOST_REPO already resolved in step 4 — reuse them here.)
mkdir -p "$MARKER_HOME/.claude/session/reviews"
# design marker keyed on the BASE repo — same key as Rex's marker + the gate (#765).
DESIGN=$(review_marker_path "$PR_HOST_REPO" <pr> design "$MARKER_HOME")
git rev-parse HEAD > "$DESIGN"
The file contains exactly one line: the 40-character HEAD SHA.
Output a single-line confirmation:
Design approval recorded for PR #<pr> at <sha>. The design-review merge gate will now allow this PR through.
Do NOT run gh pr merge yourself in the same turn. The skill's job ends at recording the marker. The merge is a separate action that still requires the CEO marker via /approve-merge plus an explicit merge instruction.
.claude/session/ is in .gitignore). It's session state, not code./approve-design <pr> is idempotent — it overwrites the marker with the current HEAD.Designer: "The mockup in Figma looks great, ship it"
You: *tries to invoke /approve-design 42* ← WRONG, twice over: a mockup nod is
not implementation review, AND
since #1042 the model cannot
invoke this skill at all.
The designer approved a mockup, not the PR's implementation of that mockup. The implementation might differ from the mockup. The correct flow:
Designer: "The mockup in Figma looks great, ship it"
You: *implements the mockup in PR #42*
You: "PR #42 implements the approved mockup. Can you review the PR diff to confirm the implementation matches?"
Designer: "Reviewed PR #42, implementation matches the mockup. Design approved."
You: "Then run /approve-design 42 to record it."
Designer: /approve-design 42 ← CORRECT: a human invokes it. The skill is
human-only (#1042), so the model cannot.
Two distinct moments. One is mockup approval (design phase). The other is implementation-review approval (code-review phase). They are not the same approval.
| Skill | Marker (repo-qualified, see AgDR-0060) | Gate hook | Who invokes |
|---|---|---|---|
/approve-merge | <owner>__<repo>__<pr>-ceo.approved | block-unreviewed-merge.sh | On explicit CEO per-PR merge nod |
/approve-design | <owner>__<repo>__<pr>-design.approved | require-design-review-for-ui.sh | On explicit designer per-PR design nod |
Both skills follow the same pattern: verify PR state → verify Rex marker → write marker at ops fork root → confirm → stop. Both refuse to write on a stale Rex base. Both are invalidated by new commits. Neither runs gh pr merge.
The merge flow for a UI PR requires three markers before the merge-gate hooks allow through:
<pr>-rex.approved — from the code-reviewer agent<pr>-design.approved — from this skill<pr>-ceo.approved — from /approve-mergePart of ApexYard — multi-project SDLC framework for Claude Code · MIT.
まだレビューはありません。使ってみた感想をお寄せください。
ログインなしで書き込めます。使ってみた感想、質問、動かなかった環境などを気軽にどうぞ。
まだコメントはありません。最初のコメントを書いてみませんか。
WCAG 2.1 AA audit — perceivable, operable, understandable, robust criteria. Deep-dive for /launch-check accessibility.
日本語の概要は準備中です。原文の説明を表示しています。
WCAG 2.2 AA audit — perceivable, operable, understandable, robust criteria. Deep-dive for /launch-check accessibility.
日本語の概要は準備中です。原文の説明を表示しています。
Browse / search / show / stats AgDRs across the portfolio — recalls "have we decided this before?".
日本語の概要は準備中です。原文の説明を表示しています。
Analytics audit — SDK config, event naming, funnel completeness, dashboards. Deep-dive for /launch-check analytics.
日本語の概要は準備中です。原文の説明を表示しています。
Record per-PR architecture-review approval for design-artifact PRs (required by the architecture gate). ONLY on an explicit per-PR architect "approved".
日本語の概要は準備中です。原文の説明を表示しています。
Record per-PR CEO approval and merge in one turn. ONLY on an explicit per-PR "approved" — never on umbrella "go".
日本語の概要は準備中です。原文の説明を表示しています。