Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Finishes a production multisig rollout after its timelock ops have executed — verifies execution (MongoDB timelock queue + on-chain isOperationDone), closes the
.claude/skills/lifinance-finish-rollout/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-17 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 153% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 39% | 0% |
Input: a #dev-sc-multisig-proposals thread link, e.g. https://lifi-protocol.slack.com/archives/C09DKGYQ1GC/p1783082088092039. Channel id is the C… path segment; the parent message ts comes from the p<digits> segment by inserting a . before the last 6 digits (p1783082088092039 → 1783082088.092039).
allowed nudge: when this rollout's ops are ready-but-unexecuted, dispatch the Timelock Auto Execution workflow (Phase 2b) — the same pipeline the cron uses — and wait for it. Every other stuck state (missing signatures, delay still running) is report-and-stop.
mutation until Phase 2 verifies every op of THIS rollout as executed (all-or-nothing).
queued/unexecuted ops on the same networks are never stoppers (mention as FYI at most).
MONGODB_URI timelock queue plus public RPCs.Do not call list-pending-proposals.ts (VPN-gated SC_MONGODB_URI) as part of this skill.
#dev-sc-multisig-proposals (C09DKGYQ1GC). Anything else: stopand ask.
closure is half the job.
gh auth status OK (deploy mode edits the rollout PR).MONGODB_URI present in .env (the verification script exits 2 if not).Read the thread. Extract:
<N>x <Contract> v<version> deployment → deploy mode;<N>x whitelist sync — … → whitelist mode. Neither → stop and ask.
Safe proposals live on: bullets (ignore trailing(nonce N) annotations).
PR with deployed addresses: / Whitelist PR:). A thread posted bymultisig-rollout always carries this link; if it's absent (thread posted by hand, or edited), stop and ask the user for the rollout PR URL rather than guessing from recent merges.
ts for the reaction, thread ts for the reply.Correlate queue rows to this rollout by deployed address in the scheduled payload:
| Chain | Contract address | … | table, or thedeployments/<net>.json diff in the PR.
config/whitelist.json diff.
bash bunx tsx script/deploy/safe/list-timelock-queue.ts \ --network <csv> --payloadContains <address csv> --checkOnChain --json
Exit codes: 0 ok, 1 real error (stop, report), 2 MONGODB_URI missing/unreachable (tell the user, stop).
status: "executed" with onChainDone: true. A diamond-called periphery rollout expects two rows per network (registration + whitelist).
queued, onChainReady: true → executable now, the cron just hasn't run →Phase 2b (trigger execution), then continue;
confirm-safe-tx.ts when it mines) → still gathering signatures;
queued, onChainReady: false → timelock delay still running;cancelled/failed → surface failureReason and ask the user how to proceed.Dispatch the same pipeline the cron uses (requires repo write access; a dispatched run always executes, even when scheduled runs are disabled):
bashgh workflow run runPendingTimelockTXs.yml --repo lifinance/contracts
The new run takes a few seconds to appear; poll until the newest workflow_dispatch run's createdAt is after your dispatch, then watch it (it may first queue behind an in-flight cron run — the concurrency group serializes them):
bashRUN_ID=$(gh run list --repo lifinance/contracts --workflow runPendingTimelockTXs.yml \ --event workflow_dispatch --limit 1 --json databaseId,createdAt --jq '.[0].databaseId') gh run watch "$RUN_ID" --repo lifinance/contracts --exit-status
Afterwards re-run the Phase 2 gate once. Green → continue to Phase 3. Still not executed → gh run view "$RUN_ID" --repo lifinance/contracts --log-failed, report, STOP — never loop dispatches.
Reply in the thread with exactly Executed, then add the rocket reaction to the parent message. Both via the Slack MCP tools; if unavailable, hand the user the exact reply text and emoji to post manually — do not use webhooks.
The production deployments/<net>.diamond.json registry only updates when the cut executes — that's now. Regenerate it from on-chain state:
bashgh pr checkout <N> source script/helperFunctions.sh updateDiamondLogs "production" "<network>" # once per impacted network
The diff MUST show the new contract/version in each impacted <net>.diamond.json — this is a second, independent execution proof. If it doesn't, that contradicts Phase 2: stop, flag, investigate; commit nothing. Otherwise commit the diamond-log diff to the PR branch and push.
/pr-ready (mandatory local review gate — resolve findings first).gh pr ready <N> (draft → ready for review)./post-pr-for-review (posts to #dev-sc-review, tags the team, enables auto-merge).Whitelist mode skips Phases 4–5: its PR was merged before the rollout started.
Networks with their executionTxHashes, Slack reply + reaction confirmation, PR state (commit pushed, ready, posted for review), and any FYI (e.g. unrelated ops still queued on the same networks).
list-timelock-queue.ts exit 2 → MONGODB_URI missing or cluster unreachable — relay,stop.
the Slack closure only if the gate passed.
investigate (wrong address correlated, or the cut executed a different payload).
gh workflow run fails in Phase 2b → the user's gh account lacks write access tolifinance/contracts; relay and stop (the cron will pick the ops up on its own).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 15,621 | 23,160 | +48% | 1 | 1 | 0% | 2,221 | 2,382 | +7% | 0 | 0 | — |
case-02 | fail→fail | 6,325 | 9,100 | +44% | 1 | 1 | 0% | 961 | 2,446 | +155% | 0 | 0 | — |
case-17 | fail→pass | 13,615 | 9,978 | -27% | 1 | 1 | 0% | 1,737 | 2,602 | +50% | 0 | 0 | — |
case-03 | fail→fail | 12,941 | 7,317 | -43% | 1 | 1 | 0% | 1,695 | 2,298 | +36% | 0 | 0 | — |
case-04 | pass→pass | 7,030 | 8,294 | +18% | 1 | 1 | 0% | 1,028 | 3,242 | +215% | 0 | 0 | — |
case-05 | fail→fail | 9,106 | 25,022 | +175% | 1 | 1 | 0% | 1,461 | 3,380 | +131% | 0 | 0 | — |
case-06 | fail→fail | 10,906 | 6,345 | -42% | 1 | 1 | 0% | 1,798 | 2,206 | +23% | 0 | 0 | — |
case-07 | fail→fail | 13,224 | 9,708 | -27% | 1 | 1 | 0% | 676 | 2,590 | +283% | 0 | 0 | — |
case-08 | fail→pass | 11,311 | 4,453 | -61% | 1 | 1 | 0% | 1,703 | 2,533 | +49% | 0 | 0 | — |
case-09 | fail→pass | 12,063 | 3,317 | -73% | 1 | 1 | 0% | 2,158 | 2,536 | +18% | 0 | 0 | — |
case-10 | fail→pass | 8,058 | 6,116 | -24% | 1 | 1 | 0% | 1,088 | 2,755 | +153% | 0 | 0 | — |
case-11 | fail→pass | 12,522 | 4,820 | -62% | 1 | 1 | 0% | 1,987 | 2,756 | +39% | 0 | 0 | — |
case-12 | pass→pass | 10,619 | 12,094 | +14% | 1 | 1 | 0% | 1,565 | 4,096 | +162% | 0 | 0 | — |
case-13 | fail→pass | 15,348 | 5,024 | -67% | 1 | 1 | 0% | 2,003 | 2,641 | +32% | 0 | 0 | — |
case-14 | pass→pass | 15,181 | 7,171 | -53% | 1 | 1 | 0% | 1,920 | 3,217 | +68% | 0 | 0 | — |
case-15 | fail→pass | 7,086 | 3,424 | -52% | 1 | 1 | 0% | 976 | 2,526 | +159% | 0 | 0 | — |
case-16 | fail→pass | 10,927 | 9,559 | -13% | 1 | 1 | 0% | 1,905 | 3,338 | +75% | 0 | 0 | — |
case-18 | fail→pass | 20,305 | 4,457 | -78% | 1 | 1 | 0% | 1,535 | 2,574 | +68% | 0 | 0 | — |
case-19 | pass→pass | 20,105 | 7,720 | -62% | 1 | 1 | 0% | 1,827 | 2,940 | +61% | 0 | 0 | — |
case-20 | fail→pass | 10,932 | 6,144 | -44% | 1 | 1 | 0% | 1,777 | 2,693 | +52% | 0 | 0 | — |
case-21 | fail→pass | 7,474 | 4,568 | -39% | 1 | 1 | 0% | 1,191 | 2,676 | +125% | 0 | 0 | — |
case-22 | fail→pass | 8,565 | 5,204 | -39% | 1 | 1 | 0% | 1,158 | 2,492 | +115% | 0 | 0 | — |
case-23 | fail→pass | 9,772 | 15,363 | +57% | 1 | 1 | 0% | 1,399 | 3,230 | +131% | 0 | 0 | — |
case-24 | fail→fail | 5,626 | 12,373 | +120% | 1 | 1 | 0% | 767 | 3,665 | +378% | 0 | 0 | — |
case-25 | fail→fail | 10,319 | 7,200 | -30% | 1 | 1 | 0% | 1,288 | 2,221 | +72% | 0 | 0 | — |
case-26 | fail→pass | 22,670 | 2,615 | -88% | 1 | 1 | 0% | 1,870 | 2,381 | +27% | 0 | 0 | — |
case-27 | fail→pass | 4,968 | 23,609 | +375% | 1 | 1 | 0% | 702 | 3,533 | +403% | 0 | 0 | — |
case-28 | fail→pass | 10,951 | 6,283 | -43% | 1 | 1 | 0% | 1,510 | 2,489 | +65% | 0 | 0 | — |
case-29 | pass→pass | 9,070 | 6,055 | -33% | 1 | 1 | 0% | 1,365 | 2,679 | +96% | 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. 29 cases were attempted, and 23 counted toward the lift figure. The other 6 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 +55 percentage points is the difference between those two pass rates over the 23 comparable cases.
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.