Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Post a `lifinance/contracts` pull request to `#dev-sc-review` and enable auto-merge (squash). Top-level message plus a thread reply tagging `@smartcontract_core`. Use when the user says "post PR for review", "send for review", "share for review", "post to dev-sc-review", or supplies a `lifinance/contracts` PR URL with review intent. Requires the Slack MCP server.
.claude/skills/lifinance-post-pr-for-review/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 197% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 218% | 0% |
| case-14 | ✓→✗ | ▼ Worse | 349% | 0% |
Posts a lifinance/contracts pull request to #dev-sc-review and (optionally) enables auto-merge. This is the smart-contract variant of post-pr-for-review and lives in the contracts repo. Other repos (backend, frontend, tooling) have their own routing skills — do not extend this one to handle them; surface the mismatch and stop.
PR URL (optional). If omitted, resolve from the current branch via:
bashgh pr view --json url,title,body,number,headRefName,isDraft
If no PR exists, ask for the URL.
This skill posts to #dev-sc-review only. If the PR's owner/repo is not lifinance/contracts, stop and tell the user which skill or channel to use instead. Do not guess a backend / frontend channel.
| Channel | Channel ID | Group tag | |---|---|---| | #dev-sc-review | C088UJWC8PR | <!subteam^S096X6MCB0C> (renders @smartcontract_core) |
@smartcontract_core MUST be sent as <!subteam^S096X6MCB0C> — plain @… does not notify (verified 2026-05-13).
Top-level message (no prefix, no decorative emoji — channel is high-signal / low-noise):
text<PR_URL> << <PR_TITLE>
Thread reply (sent immediately after the top-level):
text<!subteam^S096X6MCB0C> please review 🙏
Parse owner/repo/pull/N from URL or gh pr view. Extract title, url, number, isDraft. Confirm owner/repo == lifinance/contracts; otherwise hit the scope guard above.
Two blocking checks, one soft gate, and one workflow branch:
isResolved; use GraphQL:bash gh api graphql -f query=' query($owner:String!,$repo:String!,$num:Int!){ repository(owner:$owner,name:$repo){ pullRequest(number:$num){ reviewThreads(first:100){ nodes{ isResolved isOutdated comments(first:1){ nodes{ author{login} body url path } } } } } } }' \ -f owner=lifinance -f repo=contracts -F num=<N> \ --jq '.data.repository.pullRequest.reviewThreads.nodes | map(select(.isResolved == false and .isOutdated == false))'
Group by author; CodeRabbit is coderabbitai / coderabbitai[bot].
gh pr checks <N>): block on FAILURE / CANCELLED / TIMED_OUT / ACTION_REQUIRED. Ignore any check whose name ends in (pull_request_review) — those are review-gated workflows that haven't fired yet; posting is what triggers them, so blocking would be circular. Match on the suffix only — version-control and some protect-* checks appear in both push and (pull_request_review) forms; only the latter is exempt. Surface unfamiliar checks; don't silently widen the allowlist.audit-verification / audit-* reporting FAILURE (or pending) does NOT block posting, in either its push or (pull_request_review) form. LI.FI's flow is SC-team review first, then audit (Sujith): the PR is posted to #dev-sc-review precisely so reviewers can sign off before the audit is requested. Continue to block on every non-audit failure.aikido-mcp:aikido_full_scan with [{ relativeFilePath: "test.js", content: "// test" }] to check availability.⚠ Aikido scan skipped — MCP not configured. Run /aikido:setup to enable security pre-flight. Continue to step 3.git diff --name-only main...HEAD, scan them, filter against .agents/references/aikido-false-positive-catalog.md./aikido-address-findings and stop. Do not post until clean.gh pr ready <N>; confirm first.text Not posting to #dev-sc-review yet — please resolve these first:
Unresolved review threads (N): • <author> (X): <url>, <url>… Failing CI: • <name>: <conclusion> — <details_url>
Re-run after fixing.
This skill does NOT auto-fix.
gh pr ready <N>; confirm first.Skip confirmation if the invoking message includes explicit intent ("post for review", "ship it", "send it", "post to dev-sc-review", "move to ready and push"). Re-asking is friction the user has cleared.
Otherwise show the planned top-level + thread reply text and wait for go.
Step 3's pre-flight is the real safety net; step 4 is content-check only.
First, fetch merge state — --auto consumes immediately on a fully-approved + green PR, which would merge the PR before step 6 posts to Slack (leaving the team a "please review" message for an already-merged PR):
bashstate=$(gh pr view <N> --repo lifinance/contracts \ --json mergeStateStatus --jq '.mergeStateStatus') if [ "$state" = "CLEAN" ]; then # PR would merge instantly under --auto. Skip and ask the user: # "PR is already mergeable; not enabling auto-merge so reviewers can still see it. Merge now instead?" else gh pr merge <N> --repo lifinance/contracts --auto --squash fi
Squash is LI.FI's default for lifinance/contracts.
Silently log + continue on:
gh error → surface verbatim, ask.Opt-out: invoking message contains "without auto-merge" / "no auto-merge" / "manual merge" → skip.
Channel ID: primary is C088UJWC8PR. Use slack_search_channels as a safety net to confirm the exact-name non-archived match if needed.
Top-level: slack_send_message with text = "<url> << <title>". Capture ts.
Thread reply: slack_send_message with thread_ts = <ts>, text = "<!subteam^S096X6MCB0C> please review 🙏".
textPosted to #dev-sc-review ✓ — auto-merge (squash) enabled
gh missing / unauthenticated → ask for URL, skip pre-flight, warn.gh pr view --json reviewDecision,comments with a warning that resolution state is unknown.@<person> after the group tag in the thread reply.<!subteam^S096X6MCB0C> please review. Keep the subteam syntax — plain @smartcontract_core does not notify.Slack MCP posts as the human user, preserving thread-reply notifications and attribution — right etiquette for review channels. Webhook posting (used by audit-request-slack-relay) is intentionally NOT used here (wrong identity). No secrets stored; each teammate authenticates the MCP themselves.
The skill is intentionally scoped to lifinance/contracts → #dev-sc-review only. A multi-repo dispatcher (SC + backend + others) lives outside the contracts repo; mixing routing logic into this file invites the wrong-channel posts the routing rule was meant to prevent.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-17 | fail→fail | 6,564 | 5,009 | -24% | 1 | 1 | 0% | 1,093 | 2,926 | +168% | 0 | 0 | — |
case-01 | fail→fail | 8,657 | 4,159 | -52% | 1 | 1 | 0% | 1,308 | 2,365 | +81% | 0 | 0 | — |
case-02 | fail→fail | 8,467 | 6,588 | -22% | 1 | 1 | 0% | 1,310 | 2,619 | +100% | 0 | 0 | — |
case-03 | fail→fail | 9,535 | 5,494 | -42% | 1 | 1 | 0% | 1,493 | 2,393 | +60% | 0 | 0 | — |
case-04 | pass→pass | 6,183 | 3,526 | -43% | 1 | 1 | 0% | 889 | 2,736 | +208% | 0 | 0 | — |
case-05 | fail→pass | 6,044 | 3,011 | -50% | 1 | 1 | 0% | 907 | 2,696 | +197% | 0 | 0 | — |
case-06 | fail→fail | 10,634 | 11,738 | +10% | 1 | 1 | 0% | 1,628 | 2,483 | +53% | 0 | 0 | — |
case-07 | fail→fail | 11,770 | 6,197 | -47% | 1 | 1 | 0% | 1,938 | 2,523 | +30% | 0 | 0 | — |
case-08 | fail→fail | 10,351 | 6,194 | -40% | 1 | 1 | 0% | 1,546 | 2,493 | +61% | 0 | 0 | — |
case-09 | fail→pass | 8,881 | 3,289 | -63% | 1 | 1 | 0% | 1,303 | 2,722 | +109% | 0 | 0 | — |
case-10 | fail→pass | 12,525 | 3,116 | -75% | 1 | 1 | 0% | 1,863 | 2,682 | +44% | 0 | 0 | — |
case-11 | fail→fail | 10,391 | 5,648 | -46% | 1 | 1 | 0% | 1,743 | 2,409 | +38% | 0 | 0 | — |
case-12 | fail→fail | 15,173 | 16,128 | +6% | 1 | 1 | 0% | 1,158 | 2,617 | +126% | 0 | 0 | — |
case-13 | fail→pass | 5,312 | 3,066 | -42% | 1 | 1 | 0% | 825 | 2,623 | +218% | 0 | 0 | — |
case-14 | pass→fail | 4,008 | 6,396 | +60% | 1 | 1 | 0% | 556 | 2,497 | +349% | 0 | 0 | — |
case-15 | fail→fail | 3,036 | 6,200 | +104% | 1 | 1 | 0% | 390 | 2,558 | +556% | 0 | 0 | — |
case-16 | pass→fail | 4,869 | 5,114 | +5% | 1 | 1 | 0% | 786 | 2,467 | +214% | 0 | 0 | — |
case-18 | fail→fail | 7,469 | 6,020 | -19% | 1 | 1 | 0% | 1,002 | 2,536 | +153% | 0 | 0 | — |
case-19 | fail→fail | 2,588 | 6,104 | +136% | 1 | 1 | 0% | 411 | 2,480 | +503% | 0 | 0 | — |
case-20 | fail→fail | 7,531 | 5,926 | -21% | 1 | 1 | 0% | 1,108 | 2,493 | +125% | 0 | 0 | — |
case-21 | fail→fail | 3,793 | 7,173 | +89% | 1 | 1 | 0% | 578 | 2,639 | +357% | 0 | 0 | — |
case-22 | fail→fail | 12,270 | 2,496 | -80% | 1 | 1 | 0% | 1,989 | 2,543 | +28% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 7 counted toward the lift figure. The other 15 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +9 percentage points is the difference between those two pass rates over the 7 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.