Skip to content

DOC-6830 Add /park and /pickup skills for parked-PR lifecycle#3612

Merged
andy-stark-redis merged 13 commits into
mainfrom
DOC-6830-claude-park-and-pickup-skills
Jul 10, 2026
Merged

DOC-6830 Add /park and /pickup skills for parked-PR lifecycle#3612
andy-stark-redis merged 13 commits into
mainfrom
DOC-6830-claude-park-and-pickup-skills

Conversation

@andy-stark-redis

@andy-stark-redis andy-stark-redis commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds two Claude Code skills that extend the existing /reflect/finalize experience-notes pipeline to cover docs written against an unreleased or still-changing external source (an upstream PR, a preview feature).

  • /park — freeze a release-ready-pending-upstream branch as a PR carrying a machine-diffable pickup manifest, apply the parked / do not merge yet labels, and deliberately defer /finalize so the episodic re-check notes survive.
  • /pickup — thaw a parked PR: re-fetch each pinned source, diff its current state against the park-time snapshot, report what changed vs what was predicted, reconcile the docs, then resume /reflect/finalize. Includes a no-argument scan mode ("which parked triggers have fired?").

Files

  • .claude/skills/_shared/park-manifest.md — the manifest format, defined once and shared by both skills (mirrors how _shared/commit-trailers.md is shared by /reflect + /finalize, so the format can't drift).
  • .claude/skills/park/SKILL.md
  • .claude/skills/pickup/SKILL.md

Design notes

  • Snapshot, not a pointer. The manifest records the source's state at park time (merge status, head SHA, milestone, observed API shape), which is what makes /pickup a diff rather than a blind re-read.
  • Manifest lives in the PR body (behind <!-- park-manifest --> markers), not an in-repo file — gh can read/list it by label with nothing to clean up at merge.
  • /finalize is deferred while parked — running it would squash away the Recheck: / Gaps: trailers /pickup depends on.

Proven against a real artifact

The manifest was hand-authored on a real parked PR first (#3611, the DOC-6829 Spring Data Redis JSON docs), then the shared spec was written to match it — so the format and a live instance are in sync. Honest limitation: only the authoring side is exercised so far; the /pickup path is unrun until an upstream trigger fires (spring-data-redis#3390 will be the shakedown).

🤖 Generated with Claude Code


Note

Low Risk
Changes are agent workflow docs and tooling metadata only; no product docs, build, or runtime behavior.

Overview
Introduces a parked PR workflow for docs that are ready except for an unreleased upstream: /park opens or updates a PR with a PR-body pickup manifest (source snapshots, confidence-tagged assumptions, trailer-harvested checklist), applies parked / do not merge yet, and defers /finalize so Recheck: / Gaps: trailers survive; /pickup re-fetches pinned sources, diffs against the snapshot, reconciles docs, and resumes /reflect/finalize, with a no-arg scan mode for triggers that have fired.

The manifest contract lives once in _shared/park-manifest.md (manifest §5 points only at pickup Steps 4–5 to avoid copy drift). Review iterations on this PR also expanded .claude/state/assess-comments.coverage.md with #3612 evidence and ignores /.claude/projects/ in .gitignore.

Reviewed by Cursor Bugbot for commit d9263a6. Bugbot is set up for automated code reviews on this repo. Configure here.

Two skills that bracket the existing /reflect -> /finalize pipeline for docs
written against an unreleased or still-changing external source. /park freezes
a branch as a PR carrying a machine-diffable manifest and defers the durable
squash; /pickup thaws it once the source ships, diffing current source state
against the park-time snapshot. Format lives in _shared/park-manifest.md,
mirroring how _shared/commit-trailers.md is shared between reflect and finalize.

Built against a real artifact first: the manifest in PR #3611 (DOC-6829) was
hand-authored, then the shared spec was written to match it, so the format and
a real instance are in sync. The load-bearing design choice is that the manifest
snapshots the source's state (merge status, head SHA, milestone, observed API
shape) rather than just pointing at it — that snapshot is what makes /pickup a
diff instead of a blind re-read.

Learned: park/pickup bracket reflect->finalize; the manifest snapshot is what makes pickup a diff, not a re-read
Constraint: never run /finalize while a PR is parked — it squashes the Recheck/Gaps trailers that /pickup depends on
Rejected: in-repo .claude/parked/ manifest file | chose a PR-body block so gh can read and list it with no merge-time cleanup
Gaps: only the authoring side has been exercised; the /pickup path is unrun until an upstream trigger fires (SDR#3390 is the shakedown)
Ticket: DOC-6830
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

DOC-6830

@andy-stark-redis andy-stark-redis self-assigned this Jul 10, 2026
@andy-stark-redis andy-stark-redis requested a review from a team July 10, 2026 10:32
Comment thread .claude/skills/park/SKILL.md
Comment thread .claude/skills/_shared/park-manifest.md Outdated
Comment thread .claude/skills/pickup/SKILL.md Outdated
Comment thread .claude/skills/park/SKILL.md
Address three Cursor Bugbot findings on the skill spec: reorder the manifest's
"On pickup, then" so labels drop only after /reflect and /finalize (matching
pickup Step 5), correct scan mode to apply Step 2's trigger-met check rather
than citing Step 1, and document the `gh pr edit` re-park path alongside
`gh pr create`. The fourth finding (a High claiming the REST `merged` field
does not exist) was a false positive — the single-PR endpoint returns it — and
is left unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Comment thread .claude/skills/pickup/SKILL.md Outdated
…re reflect

Address Cursor Bugbot High 3558314964: pickup Step 4 reconciled and rebased but
never committed, while Step 5 ran /reflect and /finalize, which see committed
history only — so an uncommitted reconcile would be silently dropped from the
squash merge. Rather than bolt on a lone commit step (this is the second finding
on the pickup closing sequence — subsystem churn), specify the whole sequence
once as an explicit ordered list in Step 5 (commit -> /reflect -> /finalize ->
drop labels) and make the manifest summary defer to it as authoritative.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Comment thread .claude/skills/pickup/SKILL.md Outdated
andy-stark-redis and others added 3 commits July 10, 2026 13:09
Widen the fix for the recurring pickup closing-sequence churn instead of adding
another step. Step 5 now leads with the invariant it enforces — before the
`gh pr merge` hand-off the pushed remote PR head must contain everything that
must land (reconciliation commit, Step 4's rebased/merged-main history, and any
`/reflect` amend), because the squash sees only what is pushed — then orders the
steps commit -> /reflect -> push -> /finalize -> drop labels, with a
remote-matches-local check before hand-off. This addresses Bugbot High
3558614316 (missing push before merge), the third finding on this sequence.

Also realign the manifest's "On pickup, then" summary to that exact order
(commit -> /reflect -> push -> /finalize), per Codex review: the summary is
copied verbatim into every parked PR body, and its previous "commit and push ...
then /reflect" wording would push before the /reflect amend and re-open the gap.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Record the park/pickup review rounds on #3612: a new bugbot FP flavour (nonexistent 'merged' field, refuted empirically), an internal doc-vs-doc contradiction, and the 3-round pickup closing-sequence churn with the 'consolidation scoped too narrowly' recurrence; calibration 5 valid / 1 FP. Also correct two pre-existing off-by-one encounter counts (GraphQL, fix-quality) caught by Codex review.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Claude Code per-machine memory store belongs in ~/.claude and must never be committed; ignore any repo-root .claude/projects/ so it can't be added by mistake.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Comment thread .claude/skills/_shared/park-manifest.md Outdated
andy-stark-redis and others added 2 commits July 10, 2026 13:44
Fifth review finding on the pickup closing sequence (bugbot 3558867168, 'manifest omits rebase step') — the third on manifest-summary-vs-pickup drift. Root cause: the manifest kept a hand-maintained copy of pickup's sequence, and a copy drifts from its source every round. Rather than patch in the missing rebase (inviting a sixth finding), remove the duplication: manifest section 5 now defers entirely to /pickup Steps 4-5 as the single authoritative sequence and restates no steps, so there is nothing left to drift.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Capture the decisive round of the #3612 pickup closing-sequence churn: the fifth finding forced the structural fix (eliminate the duplicated manifest summary), generalising the earlier 'widen the boundary' rule to 'when a duplicate of a procedure keeps drawing drift findings, stop duplicating and point at the single source'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Comment thread .claude/skills/pickup/SKILL.md Outdated
andy-stark-redis and others added 2 commits July 10, 2026 14:12
…shots

Two review-driven skill fixes. Pickup: merge Steps 4-5 into one ordered git sequence (commit -> rebase/merge main + link-checks -> /reflect -> push -> /finalize -> drop labels), fixing bugbot 3558994646 — the old order ran 'git rebase' on a dirty tree before the reconciliation commit. Park: split Step 3's source snapshot into PR (pulls/<n>) and issue (issues/<n>) variants per Codex review, since the PR-only merged/head/base fields don't exist for issue-driven parks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Capture the #3612 review cycle's decisive rounds: de-duplication validated (manifest copy-drift class closed) and a distinct pickup git-op ordering thread surfaced and fixed; correct the #3612 calibration header to 6 valid / 1 FP to match its enumerated findings (Codex P3).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 91d0c20. Configure here.

Comment thread .claude/skills/pickup/SKILL.md
Comment thread .claude/skills/pickup/SKILL.md Outdated

@dwdougherty dwdougherty left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks 😎. Approved.

@andy-stark-redis

Copy link
Copy Markdown
Contributor Author

Thanks @dwdougherty !

andy-stark-redis and others added 3 commits July 10, 2026 14:31
Two Codex review residuals. Park Step 5: commit working-tree edits (notably a bannerText added in Step 4) and confirm a clean tree before pushing, so a parked PR can't get its manifest and labels while a required edit lingers local. Manifest section 5: strip the residual 'reconcile, rebase, commit, push' step list (which also implied the stale rebase-before-commit order) so it is a pure pointer to /pickup Steps 4-5 — finishing the de-duplication.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Capture the r7 finding: the pickup git sequence hit its 4th churn round (force-with-lease), and the endgame shifted from consolidation to de-prescription — assert the invariant + intent checklist, delegate git mechanics; an invariant can't be incomplete the way a command list can. Calibration 8 valid / 1 FP.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… trigger check

Address the 4th pickup git-sequence churn round (force-with-lease, bugbot 3559171169) not by patching another command but by de-prescribing: Step 5 is now the invariant + an ordered intent checklist (committed & synced -> /reflect -> remote==local -> /finalize -> labels last), delegating the exact git commands (rebase clean-tree, force-with-lease on rewritten history) to normal git — an invariant can't be incomplete the way a command list can. Also decouple Mode A's trigger check from Step 2's stop-and-report rule (bugbot 3559171157) so a scan records fired?=no and continues instead of aborting on the first not-ready PR.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@andy-stark-redis andy-stark-redis merged commit 5efd8e8 into main Jul 10, 2026
77 checks passed
@andy-stark-redis andy-stark-redis deleted the DOC-6830-claude-park-and-pickup-skills branch July 10, 2026 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants