redis/park
Freeze a release-ready-pending-upstream branch as a parked PR — open (or update) the PR with a machine-diffable unpark manifest, apply the parked / do-not-merge labels, and deliberately defer /finalize so the episodic re-check notes survive. Use when docs are written against an unreleased or still-changing external source (an upstream PR, a preview feature) and must wait for it to ship before merging. Pairs with /unpark.
npx skills add https://github.com/redis/docs --skill park
Some docs are done as far as they *can* be, but can't merge yet: they're written against an
upstream PR that hasn't merged, a feature that hasn't GA'd, an API still in review. Left as a
bare open PR, the context rots — six weeks later nobody remembers what it tracked or what was
known to be shaky. This skill freezes that context into the PR so it can be picked up
cleanly when the source settles.
Park is the pipeline's pause button between /reflect and /finalize — it preserves the
episodic layer and adds a forward-looking re-check contract, instead of distilling and
merging.
The manifest format is defined once in
../_shared/park-manifest.md — read it first, and
../_shared/commit-trailers.md for the trailer vocabulary
you'll harvest. This file is *how to build and land the manifest*.
/reflect → WIP commit messages [episodic, provisional]
↓ THIS SKILL — when the work can't merge yet
/park → parked PR + manifest [frozen; /finalize DEFERRED]
↓ (wait for the upstream trigger)
/unpark → reconcile docs vs source [thaw + delta]
↓
/reflect+/finalize → durable squash commit [resume the normal pipeline]
A note that says "watch upstream PR X" is nearly useless on unpark — it tells you where to
look but not *what changed*. The manifest must capture the source's state at park time
(merge status, head SHA, milestone, the observed API shape) so unpark is a diff, not a
fresh read. Recording the snapshot is the whole value of parking; everything else is
plumbing.
Park only when the docs are as complete as the source allows and the sole blocker is an
external event. If the work is merely unfinished, keep working. If the source may never ship,
don't park — say so. There must be a concrete, testable trigger condition.
The branch's own commits hold the re-check items, from /reflect:
git log --reverse main..HEAD --format='%(trailers:only,unfold)'
Pull the Recheck:, Gaps:, and Directive: trailers — these seed the checklist. Read the
commit bodies too, for the *why*. Don't restate them as trailers on a new commit; they belong
in the manifest checklist now (see ../_shared/park-manifest.md,
"Relationship to commit trailers").
Identify the external sources the docs depend on (URLs in the ticket, commit bodies, the page's
bannerText). For each, capture its live state with the endpoint that matches the source type.
For a GitHub pull request:
gh api repos/<owner>/<repo>/pulls/<n> \
--jq '{state, merged, head_sha: .head.sha, base: .base.ref, milestone: .milestone.title, updated_at}'
For a GitHub issue — a feature-request or GA-tracking issue, say — the pulls endpoint and
its merged / head / base fields don't exist, so use issues/<n>:
gh api repos/<owner>/<repo>/issues/<n> \
--jq '{state, state_reason, milestone: .milestone.title, updated_at, closed_at}'
Record URL + snapshot in the sources table, and the re-fetch command for unpark. Add a
confidence-tagged summary of the API/behaviour the page assumes (LOW for docs written
against an unmerged diff — and say *why* it's low, e.g. "signatures differed between two reads
of the diff").
Build the PR body: a short human summary, a prominent do-not-merge warning linking the
source, then the <!-- park-manifest -->…<!-- /park-manifest --> block with all five
required sections (per the shared spec). The page itself should already carry a bannerText
"not yet released / subject to change" note — if it doesn't, add one before parking.
bannerText you added in Step 4 — andconfirm a clean tree before pushing. The parked PR must not get its manifest and labels while a
required edit lingers only in the local working tree.
gh pr create --title "DOC-XXXX <summary> [PARKED]" --body-file <body> \
--label parked --label "do not merge yet" --base main
When the branch already has a PR (re-parking — gh pr create would fail), replace the body
and ensure the labels instead:
gh pr edit <n> --body-file <body> --add-label parked --add-label "do not merge yet"
gh pr view <n> --json labels)./finalize. State explicitly that it's deferred until unpark — the manifestrecords this, but say it in your handoff too.
Present the PR URL, the trigger condition, and the checklist, then stop. Opening a PR is
outward-facing — if the branch isn't pushed or the user hasn't asked, confirm first.
actually verify, unpark diffs against fiction. Snapshot only what you checked; leave the
rest out and flag it in the checklist.
the future. A parked PR that never triggers is dead weight — /unpark's scan mode is how you
find and close those.
you'll squash away the very notes unpark needs. Freshness is preserved *in the manifest*, not
in a premature durable commit.
live only in scattered trailers and the unparking starts blind.
Take redis/park 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.