redis/unpark
Thaw a parked PR — re-fetch each pinned source, diff it against the manifest snapshot taken at park time, report what changed vs what was predicted, then reconcile the docs and resume the normal pipeline (/reflect → /finalize) toward merge. Run with a PR number, or with no argument to scan all parked PRs and report which triggers have fired. Pairs with /park.
npx skills add https://github.com/redis/docs --skill unpark
/park froze a PR with a snapshot of the source it tracks. Time passed; the source moved —
the upstream PR merged, the API changed, a version shipped. This skill thaws the PR: it
diffs the source's *now* against the *then* recorded in the manifest, tells you exactly what
changed, reconciles the docs, and hands back to the normal merge pipeline.
The manifest format is defined in
../_shared/park-manifest.md — read it first. Trailer
vocabulary for the reflect/finalize handoff is in
../_shared/commit-trailers.md.
/park → parked PR + manifest snapshot [frozen]
↓ (the trigger fires)
/unpark → diff source now vs snapshot [THIS SKILL: thaw + reconcile]
↓
/reflect+/finalize → durable squash commit [resume: predicted-vs-actual, distill]
The manifest's value is the snapshot. Use it: fetch the source now, compare field-by-field
against what park recorded, and let the *delta* drive the edits. Rewriting the page blind
throws away the park-time reasoning and re-introduces whatever was already got right. Report
the delta first; edit second.
List every parked PR and report, for each, whether its trigger has fired — the standing answer
to "what's waiting, and is any of it ready?"
gh pr list --label parked --json number,title,url,updatedAt
For each, read the manifest's Trigger to pick up:, snapshot the current source state (Step 1's
re-fetch only — don't do the full reconcile), then compare that state to the trigger condition to
decide fired?. Use only Step 2's *comparison* — not its stop-and-report rule: in scan mode
a not-met trigger is recorded as fired?=no and you continue to the next PR, never aborting the
loop. Output a table: PR / trigger / fired? / one-line delta. Recommend which to unpark, which are still waiting, and which look abandoned (source
closed-unmerged, or long dead). Then stop — unparking one is Mode B.
Read the PR body, slice out the <!-- park-manifest -->…<!-- /park-manifest --> block. For
each pinned source, run its recorded re-fetch command and capture current state.
Compare current vs park-time, field by field. Has merged flipped true? Has head SHA moved
(the diff may have changed under review)? Is a milestone / version now set? For a merged PR,
read the released source at the merged tag, not the PR branch. Confirm whether the trigger
condition is genuinely met — if it isn't, stop and report; unparking early re-freezes bad
info.
Take each - [ ] item in the manifest and resolve it against the current source: **confirmed
as-written, changed → here's the correction, or still open**. This is the core output —
a per-item verdict, highest-risk items first. Verify against the actual released source, never
the park-time assumption (which was often LOW-confidence by design).
Apply the corrections: fix signatures/config, fill version placeholders, add sections for
pieces that landed after park (e.g. a deferred API), convert provisional inline examples to
tested examples where the tooling now allows, and remove the page's bannerText "not yet
released" warning. This step is only *what to change* — the git operations that make those
changes land (including the rebase and link checks) come next, in order.
Unpark reconciles; it does not merge. /finalize prepares a squash that operates on the
pushed remote PR head, so the invariant governing this whole step is:
> Before the gh pr merge hand-off, the remote PR branch must already contain **everything
> that must land** — the reconciliation commit, the rebased/merged-main history, and any
> later amend. The squash sees only what has been pushed; anything left local is silently
> dropped from the merge.
The checklist below is the intent — *what must be true*, in this order — before the
gh pr merge hand-off. It is not a command script: achieve each state with normal git, minding
the edge cases of an already-pushed, rebased branch (a rebase needs a clean tree; pushing
rewritten history needs --force-with-lease). Stating intent rather than commands is deliberate —
enumerating the exact git steps here drifted out of date every review round.
main, link checks and relreftargets re-verified.
/reflect recorded on that commit — *predicted-vs-actual*: what the park snapshot gotright, what the source changed (closes the loop; calibrates future preemptive docs).
reaches the squash until it is.
/finalize run — the durable squash deferred at park time, now that the source hassettled; it reconciles the whole arc (park notes + unpark findings + any review) and prepares
the gh pr merge … --body-file command.
parked / do not merge yet and strip the manifest blockonly after /finalize. The merge guard holds until then.
Before handing off, confirm the remote head matches local (working tree clean, branch not
ahead of origin). Then present: the delta report, the doc changes, the finalize output + the
gh pr merge … --body-file command, and stop. The human triggers the merge.
follow-ups before release. If milestone/version is unset, treat the API as not-yet-final and
lean toward staying parked. Report the ambiguity; don't force it.
/park recorded an unverified shape, the diff isagainst fiction — so re-verify high-risk checklist items from source regardless of what the
snapshot claimed, especially anything tagged LOW.
degrades to a blind re-review — still useful, but the park-time context is gone.
released API matches even a HIGH-confidence snapshot.
Take redis/unpark from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.