merge-briefing
On-demand home for the pre-merge approval procedure — the three-surface pre-ask probe, grading every open finding by its blocking decoration, carrying the…
Skill by devseunggwan
Chalk Labs
Need help deploying merge-briefing?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/devseunggwan-merge-briefing
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/merge-briefing
What's inside
- Skill name
merge-briefing- Description
- On-demand home for the pre-merge approval procedure — the three-surface pre-ask probe, grading every open finding by its blocking decoration, carrying the anchor's `Unverified` gaps into a follow-up, the six-part briefing, and the `AskUserQuestion` approve-ask that ends it.
- License
- MIT
- Instructions
- 385 lines in SKILL.md · view on GitHub
Agent Skills spec issues
- allowed-tools: must be a space-separated string
Files (1)
- SKILL.md
SKILL.md (first lines)
# merge-briefing
## Overview
A merge is irreversible shared state, so it is gated on the user's explicit
per-PR answer. The gate is cheap to satisfy formally and easy to satisfy
falsely: the honest version needs a probe wide enough to support "nothing is
open", and the surface where blocking findings actually live — inline review
threads — is the one a natural-looking `gh pr view --json comments,reviews`
call silently omits.
This skill is the on-demand home for that procedure. The *Pre-Merge Reporting*
rule ([`ETHOS.md` → Rules praxis carries](../../ETHOS.md#rules-praxis-carries))
keeps the gate; the six-part list in Step 4 below is the report's shape; the
steps below are how you get from "the PR looks done" to a question the user
can answer in one word.
**Core principle:** the briefing is a claim about the PR's state, so every line
in it is probed at compose time — not recalled from when the PR was opened.
## When to Use
- About to ask the user to approve a merge.
- A merge was requested and you have not yet surfaced a briefing this turn.
- Re-asking after a previous ask went unanswered, or after CI/review moved.
- A companion, follow-up, or regenerated PR is next in a cluster the user
already approved once.
## The Iron Law
- **One PR, one briefing, one answer.** Approving PR X approves only X. The
one exception is the [bulk merge](#bulk-merge-several-prs-one-answer): one
turn with a separate briefing section per PR, one ask that lists them, and
an answer that approves the listed set.
- **Compose the briefing from this turn's probe output.** An entry-time `CLEAN`
status is not permanent; a stale anchor makes the user discover a conflict
you should have caught.
- **Never merge on a progress signal.** "계속", "ok", "진행" move work forward;
they are not consent for a shared-state mutation.
## Process
### Step 1: Probe all three surfaces
Findings live on three surfaces and no single command covers them. Run all
three before writing a word of the briefing.
```bash
# 1 — CI
gh pr checks <N> --repo <owner>/<repo>
# 2 — conversation timeline + review bodies + mergeability + pushed HEAD
gh pr view <N> --repo <owner>/<repo> \
--json mergeable,mergeStateStatus,isDraft,headRefOid,reviews,comments
```
```bash
# 3 — inline review threads (the surface #2 does NOT include)
gh api graphql --paginate -f query='
query($owner:String!, $repo:String!, $pr:Int!, $endCursor:String) {
repository(owner:$owner, name:$repo) {
pullRequest(number:$pr) {
reviewThreads(first:100, after:$endCursor) {
pageInfo { hasNextPage endCursor }
nodes {
id isResolved isOutdated path line
comments(first:1) { nodes { author { login } body } }
}
}
}
}
}' -F owner=<owner> -F repo=<repo> -F pr=<N> \
--jq '.data.repository.pullRequest.reviewThreads.nodes[]
| select(.isResolved | not)
| {id, path, line, author: .comments.nodes[0].author.login,
body: .comments.nodes[0].body}'
```
`body` is in the projection because the label is in the thread's own text, and
the label is what Step 2 grades on. `--paginate` with `$endCursor` is not
decoration — a PR two bots have worked over passes 100 threads, and a single
page silently drops the rest, which then reads as "no open threads".
**Surface #2 truncates at 100 as well, and silently.** `gh pr view --json
comments,reviews` issues `comments(first: 100)` / `reviews(first: 100)` with no
cursor variable, so on a PR past either count the tail is simply absent. When
one of them is at 100 rows, re-collect that surface through the paginated REST
endpoint before grading:
```bash
gh api repos/<owner>/<repo>/pulls/<N>/reviews --paginate -q '.[] | {user: .user.login, state, body}'
gh api repos/<owner>/<repo>/issues/<N>/comments --paginate -q '.[] | {user: .user.login, body}'
```
**An empty result is not yet an answer.** It means "no open threads" and "the
query is wrong" at the same time until you have seen this exact query print
rows on a PR known to have them. Run it once against such a PR; that is the
positive control the negative claim rests on.
In a fork clone, `--repo` must name the fork on every probe: a bare `gh pr`
call resolves against the parent repo (see `worktree-merge-cleanup` →
*Pre-call checklist*).
If CI is pending or failing, **stop here** — do not ask yet. A briefing whose
verification rows are still moving is asking the user to approve a guess.
**Read which commit each human approval covers** before writing "approved":
`reviewDecision: APPROVED` survives later pushes. Group the reviews by
reviewer and take each one's **latest** `APPROVED` review (an earlier approval
is superseded by a re-approval; a later `CHANGES_REQUESTED` or `DISMISSED`
from the same reviewer means no current approval). Compare that review's
`commit_id` with `headRefOid` and list the non-merge commits after it
(`git log --no-merges <commit_id>..<head>`) in part 5 as "not reviewed by
<human>" (see the Failure Modes row for the command).
**The merge state is an allowlist, not a "not obviously broken" check.** Ask
only when `mergeable` is `MERGEABLE` **and** `mergeStateStatus` is `CLEAN` or
`HAS_HOOKS` — those two are the only values that mean mergeable with a passing
commit status. Every other value stops the ask and names itself in the briefing:From devseunggwan/praxis, MIT.
More from devseunggwan/praxis
- 0.592score
stale-pr-revival
devseunggwan
Bring an open, stalled pull request back to a mergeable state without rewriting its history — read every review surface, merge the base in, integrate what…
SkillAFreshness: A★ 1Claude Code +9 - 0.588score
codex-review-wrap
devseunggwan
Worktree-aware wrapper for /codex:review.
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
upstream-bug-report
devseunggwan
Take a defect in an installed third-party plugin, server, or library from local diagnosis to an issue on its public repository — prove the fix in a fresh…
SkillAFreshness: A★ 1Claude Code +9 - 0.585score
retrospect
devseunggwan
Session retrospect — analyze the current Claude Code session against the rules it ran under (project and global `CLAUDE.md`), identify friction patterns and…
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
reset-strikes
devseunggwan
Reset the current session's strike counter to 0 and clear the recorded violation list.
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
strike
devseunggwan
Declare a rule violation in the current Claude Code session.
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
surface-enumeration
devseunggwan
Pre-implementation input-surface enumeration — before writing a parser/validator/sanitizer/classifier, enumerate every input variant so each becomes a…
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
strikes
devseunggwan
Show the current session's strike count (0-3) and the list of recorded violation reasons.
SkillAFreshness: A★ 1Claude Code +9 - 0.581score
perf-leak-review
devseunggwan
Point at performance-defect and memory-leak candidates in a diff — a read-only LLM reviewer reads the change plus the repository around it and reports…
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
tradeoff
devseunggwan
Score the options at a decision fork on four cost axes — reversibility, blast radius, cost-if-wrong, process cost — with a provenance grade on every cell so a…
SkillAFreshness: A★ 1Claude Code +9 - 0.580score
worktree-merge-cleanup
devseunggwan
On-demand home for the pre-merge worktree precondition and the unified post-merge cleanup sequence — how to run `gh pr merge --squash --delete-branch` from…
SkillAFreshness: A★ 1Claude Code +9 - 0.579score
cmux-recover-sessions
devseunggwan
Bulk recover Claude Code sessions after a crash, power loss, OOM kill, or reboot by scanning the .jsonl files Claude Code persists automatically.
SkillAFreshness: A★ 1Claude Code +9
Signals
- Stars
- 1
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Oct 14, 2026 (16 days ago)
- Last release
- Oct 24, 2026 (6 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/devseunggwan/praxis
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from devseunggwan
- 0.592score
stale-pr-revival
devseunggwan
Bring an open, stalled pull request back to a mergeable state without rewriting its history — read every review surface, merge the base in, integrate what…
SkillAFreshness: A★ 1Claude Code +9 - 0.588score
codex-review-wrap
devseunggwan
Worktree-aware wrapper for /codex:review.
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
upstream-bug-report
devseunggwan
Take a defect in an installed third-party plugin, server, or library from local diagnosis to an issue on its public repository — prove the fix in a fresh…
SkillAFreshness: A★ 1Claude Code +9 - 0.585score
retrospect
devseunggwan
Session retrospect — analyze the current Claude Code session against the rules it ran under (project and global `CLAUDE.md`), identify friction patterns and…
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
reset-strikes
devseunggwan
Reset the current session's strike counter to 0 and clear the recorded violation list.
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
strike
devseunggwan
Declare a rule violation in the current Claude Code session.
SkillAFreshness: A★ 1Claude Code +9
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get merge-briefing running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
merge-briefing skill. Agent Mart. https://agentmart.dev/skills/devseunggwan-merge-briefing (last updated 2026-10-24)