From pulp
Leveraged-prototype dev loop (`pulp loop`) — single-platform iteration with AOT analyzer, ar-swap, and PR-state monitor. Use when porting an existing UI/bundle to Pulp, doing visual/behavioral parity work, or batching upstream framework gap fixes.
npx claudepluginhub danielraffel/pulp --plugin pulpThis skill uses the workspace's default tool permissions.
Codifies the leveraged-prototype dev loop documented in pulp [#940](https://github.com/danielraffel/pulp/issues/940). The loop closed 5 framework gaps in ~2 hours during the 2026-04-28 Spectr-on-`@pulp/react` parity session.
Monitors deployed URLs for regressions after deploys, merges, or upgrades by checking HTTP status, console errors, network failures, performance (LCP/CLS/INP), content, and API health.
Share bugs, ideas, or general feedback.
Codifies the leveraged-prototype dev loop documented in pulp #940. The loop closed 5 framework gaps in ~2 hours during the 2026-04-28 Spectr-on-@pulp/react parity session.
Trigger this skill when the user is doing any of:
@pulp/react is the canonical example).Do not trigger for: bugfixes, cross-platform refactors, or final-landing flows. Those want the cross-platform default.
shipyard pr / pulp pr) before landing. The ship path validates cross-platform regardless, but exiting focus mode keeps subsequent local iteration honest.analyze → file → prototype (ar-swap) → monitor → bump → ship
Each step has tooling. Some ships in Slice 1 (this PR), some lands in follow-up slices.
| # | Surface | Status | Issue |
|---|---|---|---|
| 1 | pulp loop CLI + skill + slash command + docs | shipped | #940 |
| 2 | pulp-ar-swap.sh ABI-checked archive splice | deferred | #946 |
| 3 | pulp loop --watch-issues PR-monitor | deferred | #947 |
| 4 | Lift @pulp/css-adapt, pulp-css-analyze, extract-html-bundle | deferred | #948 |
Run pulp-css-analyze (Slice 4, lifting from spectr/native-react/tools/pulp-css-analyze until then) over the consumer's pre-built React bundle. The output is a coverage report listing unmapped CSS props with occurrence counts.
Reference output shape:
Unmapped CSS props (8 total):
fontFamily 14× examples: src/Label.tsx:23, src/Header.tsx:8, ...
textAlign 6× examples: src/Caption.tsx:12, ...
...
The occurrence counts are how you prioritize — file the 14× issue first.
Each gap deserves its own issue. The shape that worked on 2026-04-28:
label.set_font_family("Inter") followed by label.font_family() == "Inter" returns true".label.set_font_family(string) mirroring set_font()".Filing 6 well-shaped issues with concrete signatures cuts upstream ramp-up dramatically. If you're going to file an umbrella + sub-issues, link the sub-issues from the umbrella's body so the dashboard view is coherent.
pulp loop)pulp loop # auto-detect host platform
pulp loop --platform=macos # explicit override
pulp loop --status # report current state
pulp loop --off # restore cross-platform mode
The CLI persists [loop] focus_platform = "..." in ~/.pulp/config.toml. Subsequent invocations stay pinned until explicitly cleared.
--no-watch flips state and exits without entering the watch loop — this is what tests use, and it's also useful when you want the marker but plan to drive builds yourself.
Pick the simplest gap from your filed issues. Build the framework patch in another worktree:
git worktree add ../pulp-fix-issue-X feat/fix-issue-X
cd ../pulp-fix-issue-X
cmake --build build --target pulp-view
Once Slice 2 ships, pulp loop --ar-swap-from ../pulp-fix-issue-X will splice the changed .o files into the pinned SDK's static archive after validating header/library ABI. The validator refuses on vtable mismatch — that's the trap that bit during the 2026-04-28 session with Label::font_family_.
Until Slice 2 lands, do the ar-swap by hand:
nm -gU the object — make sure exported symbols match what your consumer's compile expects.ar -r <pinned-sdk>/lib/libpulp-view.a <patched.o> — splice.pulp-screenshot or pulp loop's screencap.Once Slice 3 ships:
pulp loop --watch-issues 924,927,931,932
will poll gh pr list for state flips on PRs referencing the named issues. It fires a notification when each PR transitions to MERGED.
Until then, run this in a side terminal:
watch -n 60 'gh pr list --state merged --search "924 OR 927 OR 931 OR 932" --json number,title,mergedAt'
After the upstream batch merges and auto-releases:
0.52.0 → 0.56.0 if v0.53/v0.54/v0.55/v0.56 each came from one of the merged PRs). Update pulp.toml / find_package(Pulp …).pulp loop --off — restore cross-platform mode.shipyard pr (or pulp pr) — full cross-platform validation gates the merge. This is the contract: focus mode for iterating, cross-platform for landing.When you discover a new framework gap while in focus mode, file it the same way as Step 2. Don't fix it locally and forget — the loop's discipline is upstream-first.
If you fixed something locally to keep iteration moving and the upstream issue isn't merged yet, leave a // TODO(issue-NNN) marker and a planning doc note in the consumer. The skill is "file framework issues immediately", not "fix and forget".
pulp loop --platform=macos → all subsequent rebuilds are single-platform.pulp loop --off → restores cross-platform mode.shipyard pr (or pulp pr) → still runs full cross-platform validation before merge regardless of focus state.The mode is advisory at the build layer today. The marker is read by tooling that wants to know "is the developer iterating or landing?", but it does not silently hide cross-platform breakage. Slice 1 keeps the marker semantically clean: "I am iterating, please don't surprise me with cross-platform configure cost."
pulp loop --off is one extra keystroke, but it's how you preserve the "single-platform for iterating, cross-platform for landing" separation. The ship path validates regardless, but the marker should match reality.--watch-issues monitor (Slice 3) is the structural answer. Until then, set a 5-minute timer or pin the gh pr list watch in a side terminal..a vtable mismatch is the trap. Slice 2's helper refuses on mismatch; until then, nm -gU the patched object before splicing and delete the local archive after validation.PULP_HOME, so two worktrees pointing at the same ~/.pulp/config.toml share the marker. If you're working on macOS in one worktree and want a Linux focus check in another, use PULP_HOME=/tmp/pulp-linux pulp loop --platform=linux.The Claude Code slash command lives at .claude/commands/prototype-loop.md. It asks the user to confirm the focus platform, then orchestrates the loop.
feature/native-react-editor branch, planning/spectr-style-coverage-report.mddocs/guides/focus-mode.md