Skip to content
cccskills
FreePublished on GitHub

pr-batching

Decide whether several finished branches ship as ONE PR or stay separate. Use when holding 2+ green branches before `shipyard pr`. Trades CI cost against revert granularity, urgency, and the diff-coverage gate.

The English summary is being prepared. Showing the original description.

See how to install

Files included (1)

  • SKILL.md5.1 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

PR batching

A PR costs ~an hour before it can merge: a ~25-min local diff-coverage build, then a Shipyard validation. Validations must run serially (concurrent runs from worktrees sharing one .git race on config.lock). So n related PRs is n sequential hours, not n parallel ones.

That makes "ship these together?" a real question. This is the checklist.

Default: combine

If you hold 2+ finished, green, related branches — combine. Separate PRs are what you justify, not the reverse.

Combine when

  • They share unmerged work. Check first — you may already have the combined branch:
    git merge-base --is-ancestor feature/a feature/b && echo "b already contains a"
    # siblings: is their common point AHEAD of origin/main?
    git rev-list --count origin/main..$(git merge-base feature/a feature/b)
    
    A chain is the combined PR — open it from the tip. Siblings fold with a cherry-pick.
  • One depends on the other. If B only compiles because of A, they were always one change.
  • Same subsystem. One context, one adoption note, one revert.
  • A well-tested branch would lift a weak one over the coverage gate. Coverage is computed over the whole PR diff, so folding in a densely-tested branch raises the ratio. A branch stuck at 68% can clear 75% by merging with a sibling that ships 20 test cases. This is adding covered lines, not hiding uncovered ones — legitimate.
  • Fewer chances to re-conflict the version-bump line on a busy main.

One PR per family per session

A single agent session routinely produces a run of small, related changes to one manifest or branch family on the same day. Shipped one at a time, each pays its own PR-head gate and its own merge-group gate; the merged-change average was 4.2 native gate runs per change when sessions did this. The rule:

  • Same session + same manifest or branch family + same day ⇒ one PR per family. A session with fourteen such changes ships two to four PRs, not fourteen.
  • Before running shipyard pr on the second change of a family, check whether the first is still open. If it is, and it is not yet in the merge queue, push the new commit onto that branch instead of opening a sibling PR.
  • The pre-push advisor lists the related local branches it found and records each firing in ${XDG_STATE_HOME:-~/.local/state}/pulp/pr-batch-advice.jsonl; that log is how the advice is measured.

Never fold, even inside one family:

  • anything likely to be ejected (a known-flaky area, a change to a test the queue is currently failing on) — one ejection costs every entry of the batch;
  • anything urgent, especially a fix for a red main — it ships alone and jumps;
  • a docs-only PR into one that runs the native gate, since the docs PR would then pay for a build it does not need;
  • unrelated subsystems, unfinished work, or a change that may need reverting alone (see below).

Keep separate when — any ONE of these

  • One is urgent, the other is gated. Never make a ready branch hostage to a blocked one. An hour of CI is cheaper than a day of someone else's blocked work.
  • One is unfinished — a library with no caller, an unwired command, uncommitted files. Never ship half-done work to save a CI run. This is the trade that looks tempting and is always wrong.
  • Unrelated subsystems. Costs revert granularity, muddies the migration note.
  • One is risky enough it might need reverting — isolate it, or a revert drags good work out with it.
  • One carries a large untestable surface (native window hosts, format adapters needing a real DAW). It drags combined coverage down — the inverse of the lift above. Check which way it cuts.

Folding siblings

cd <worktree-of-primary-branch>
git log --oneline <shared-base>..feature/sibling   # confirm its OWN commits
git cherry-pick <sha>...
tools/ci/governed-build.sh cmake --build build
ctest --test-dir build --output-on-failure -R '<affected>'

Cherry-picks compile and still break behaviour — a change fine against the old base can violate an invariant the other branch just introduced. Run the suites together before shipping.

Don't

  • Don't run two heavy builds at once to "save time." They contend, and the contention surfaces as test failures (shellout tests time out under load), costing you an investigation into a bug that does not exist.
  • Don't batch to dodge a gate. Adding covered lines to raise a ratio is fine. A PULP_SKIP_* bypass is not.

Enforcement

This skill is the judgment. tools/scripts/pr_batch_advisor.py runs from .githooks/pre-push (advisory, never blocks) so the question gets asked no matter who is driving — Claude, Codex, a human, gh pr create, or shipyard pr. A skill only reaches an agent that reads it; a push reaches everyone.

Silence one push: PULP_SKIP_PR_BATCH_ADVICE=1.

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

aax

Free

Optional AAX support for Pulp, including developer-supplied Avid SDK setup, CMake enablement, DigiShell/AAX Validator workflows, and local AAX builds on macOS or Windows.

The English summary is being prepared. Showing the original description.

Generous-Corp/pulp22Updated Oct 19, 2026

Configure, implement, and test Pulp's optional desktop Ableton Link tempo-sync adapter while preserving the developer-supplied SDK, licensing, realtime, latency-compensation, and no-install boundaries.

The English summary is being prepared. Showing the original description.

Generous-Corp/pulp22Updated Oct 19, 2026

Maintain Pulp's installed design-time agent capability manifest and public-surface ledger. Use when adding, removing, renaming, or materially changing public audio, MIDI, signal, timebase, or sequence APIs; registering a new algorithm for generators; changing capability support or deprecation state; or repairing agent-capabilities freshness, schema, fingerprint, tombstone, or installed-SDK tests.

The English summary is being prepared. Showing the original description.

Generous-Corp/pulp22Updated Oct 19, 2026

Android platform development for Pulp — NDK cross-compilation, Oboe audio, Dawn/Skia GPU rendering, JNI bridge, touch interaction, emulator workflows, and end-to-end smoke validation. Covers build, deploy, debug, and the gotchas discovered during bringup.

The English summary is being prepared. Showing the original description.

Generous-Corp/pulp22Updated Oct 19, 2026

ara

Free

Optional ARA support for Pulp, including developer-supplied ARA SDK setup, CMake enablement, adapter companion APIs, validation, and ARA-aware plugin implementation guidance.

The English summary is being prepared. Showing the original description.

Generous-Corp/pulp22Updated Oct 19, 2026

The measurement surface for ALL Pulp DSP and audio-pipeline work — read it BEFORE writing or gating DSP, not only when something already sounds wrong. Covers the C++ harness (signal generators, metrics, assertions, RenderScenario, contracts), the offline Audio Doctor (magnitude/frequency response, THD/THD+N, phase/group delay), and their Python sibling the Audio Quality Lab (tools/audio/quality-lab — null residual + alignment, LTAS log-spectral distance, spectral flux/centroid, HNR, Theil-Sen drift slope, Kaiser-sinc resampling, license-guarded corpus, regression-net ratchet). TRIGGER on AUTHORING work — "build/design an oscillator/filter/synth/effect", "add a DSP module", "what should the acceptance gate be", "how do I measure aliasing / anti-aliasing / alias floor", "null against a reference", "is this DSP correct", "choose a tolerance", "golden/regression corpus for audio", "measure drift or jitter", "A/B two renders" — AND on DEBUGGING work — "is there sound / no audio / I hear nothing", "does this filter/compressor/synth/delay produce the right signal", "prove the DSP / prove the contract", "measure the frequency response", "what's the THD / is it distorting", "what's the group delay / phase response / measured latency", "magnitude response curve", "render a test tone and assert", "audio regression", "64-frame works but 128 is silent", "sample-rate change pitch-shifted it", "describe what's in this buffer", "audio doctor", "compare before/after a DSP refactor". Reach for this BEFORE hand-rolling any FFT, null test, alias measurement, pitch tracker, or golden-render script — most of it already exists in one of the two lanes. Test/tool layer over HeadlessHost — deterministic, no audio device, no speakers. Off the realtime thread entirely.

The English summary is being prepared. Showing the original description.

Generous-Corp/pulp22Updated Oct 19, 2026

See all skills by Generous-Corp

Report a problem with this skill