Paperclip Weekly #12: Plan-review wakes, sandbox custom images, ⌘K project navigation, and more
- Commits summarized
- 54
- Period
- Jun 29 - Jul 05, 2026
- Published
- Jul 06, 2026
Paperclip Weekly #12: Plan-review wakes, sandbox custom images, ⌘K project navigation, and more
Repository: paperclipai/paperclip
Period: 2026-06-29 – 2026-07-05
Cadence: Weekly
Who should read this: Operators running Paperclip agents in sandboxed environments, developers building on the adapter layer, and anyone tuning agent plan-review workflows, CI speed, or the ⌘K command palette. The week's 54 commits include three cross-cutting feature additions and several focused fixes.
🧠 Smarter plan-review agent wakes
Commit: 5e3d6e36 — Dotta
When an agent is woken after a plan comment, inline annotation, or request-confirmation decision, it previously lacked enough inline context to act on the specific feedback — often falling back to broad refetches of issue history.
What changed: Wake payloads and heartbeat context now include bounded plan-review context: open plan annotation threads, recent annotation comments, truncation metadata, and plan-confirmation interaction targets/results. The adapter wake prompt renders this information directly so agents see the relevant feedback immediately.
- New shared
PlanReviewContexttypes for annotation threads, comments, interaction targets, and continuation results. - Server-side assembly with per-thread, per-comment, and total-body size limits.
- Resolved annotation threads are intentionally excluded to keep wake payloads focused on feedback still needing action.
- Regression tests cover scoped context assembly, wake prompt rendering, annotation filtering, and safe standard-mode annotation wakes.
Aligns with roadmap areas for Agent Reviews and Approvals, Deep Planning, and Enforced Outcomes.
🖼️ Reusable sandbox custom images
Commit: 8d9f9fd2 — Devin Foley
Sandboxed agents previously had no shared contract for capturing and reusing prepared runtime state — operators had to rebuild tools, credentials, and dependencies for every lease.
What changed: A full provider-level custom-image capability across the provider contract, server runtime, and board UI.
- Provider contract for setup/capture lifecycle with image metadata, labels, and status transitions.
- Server-side setup, capture, deletion, and testing flows with dedicated routes and service logic.
- Daytona and fake-provider implementations with expanded contract coverage.
- Board UI controls for creating, testing, selecting, and deleting custom images.
- Probe and sandbox-copy flows updated to align with pre-authenticated and custom-image environments.
- Expanded contract test coverage across server routes, service layer, and provider fakes.
🔧 Fixes
Fix sandboxed Claude and Codex probe behavior
Commit: 0c2ec7de — Devin Foley
Sandbox probes for claude_local and codex_local adapters could diverge from real runtime behavior — surfacing misleading errors, relying on host-only state, or uploading excessive Codex home data.
- Claude sandbox probes now materialize the same Paperclip-managed config seed path used by sandbox execution and preserve sandbox-local credentials.
- Improved hello-probe diagnostics surface the final error instead of stream init events.
- Codex probes upload only minimal auth/config files instead of the full managed
CODEX_HOME. - Host-local session/shell state excluded from sandbox runtime home uploads.
- Codex local default model switched away from the unsupported
gpt-5.3-codexoption. - Regression coverage for Claude parsing/probe paths and Codex adapter metadata/argument/probe behavior.
Fix active heartbeat run reaping across service instances
Commit: f019f54b — Devin Foley
When routes and scheduler paths constructed separate heartbeatService() instances in the same process, the orphan reaper could mark an actively executing run as process_lost — particularly affecting remote/sandbox adapters that may not persist local PID metadata.
Fixed: Active adapter execution tracking moved from per-instance closure to shared module-level process state. Added regression test proving cross-instance reaping skips live runs.
Fix stale watchdog state in Issue Properties pane
Commit: 37c097a4 — Dotta
Watchdog configuration changes made from the Issue Properties pane could leave stale state visible until a later refetch.
- Saved watchdog summaries are written directly into cached issue detail data after upsert/delete mutations.
- Watchdog fields included in
buildIssuePropertiesPanelKeyso configuration changes invalidate memoized state.
Fix stale server info debug metadata
Commit: a7a73d5b — Devin Foley
The experimental server-info debug view (behind enableServerInfoDebugView) could show stale health-query data and freeze commit metadata at process boot.
- Health query refetches when the drawer opens and polls every 2s while active.
- Git HEAD refreshed through a short TTL cache instead of freezing at module boot.
- New
serverInfo.git.localChangesfield reports staged, unstaged, and untracked counts (no paths). "Checkout state" row renders clean/dirty/unavailable copy.
Fix markdown contrast on accent chat bubbles
Commit: 4a2447da — Aron Prins
Shared .paperclip-markdown rules forced var(--foreground) for body text, which was too dark on the saturated blue current-user chat bubble.
Fixed: New .paperclip-markdown-on-accent class with explicit color overrides for body text, list markers, headings, links, blockquotes, and inline code on accent backgrounds. Applied only to current-user issue chat messages; neutral surfaces unchanged.
✨ Features
Unify issue media attachment gallery
Commit: b4fccaa8 — Dotta
Media attachments were handled through separate gallery entry points across issue detail pages and run output cards, creating an inconsistent viewing experience.
What changed: A unified gallery path shared across issue attachments, output cards, and issue detail rendering. Includes image gallery modal coverage, keyboard navigation, and regression tests. Primary video output actions are preserved alongside gallery browsing.
Add pipeline automation title templates
Commit: 3e31bf09 — Dotta
Pipeline-created issues previously lacked configurable titles, making automated output harder to scan.
What changed: New issueTitleTemplate field through shared contracts, server persistence, API routes, and the pipeline settings UI. Title-template rendering applied when pipeline automations create issue work. Cursor restoration moved into a layout effect for reliable token editing.
Project typeahead in ⌘K command palette
Commit: ef6061a5 — scotttong
Projects were ranked below tasks in the ⌘K palette, so typing a project name would surface mostly tasks above the fold and bury matching projects.
Fixed: Client-side project matching (exact → prefix → substring → description → fuzzy-subsequence ranking, capped at 5) promotes matching projects into a dedicated "Projects" group above Tasks. Task cap reduced from 10 → 6 when projects are promoted. Project name span fixed so it remains visible in the typeahead row.
⚡ Build & CI
Drop redundant tsc from UI build, saving ~46s per CI run
Commit: b61c2852 — Devin Foley
The ui package ran tsc -b (~46s) before vite build (~20s) in the slowest CI job (Canary Dry Run, ~4m). Since tsconfig.json sets noEmit: true, the tsc pass produced no artifacts — it was a pure type-check running on the build critical path.
Fixed: ui/build changed from tsc -b && vite build to vite build. Type coverage is preserved by the existing parallel Typecheck job (typecheck:build-gaps), which automatically type-checks any workspace whose build script omits tsc.
Week in numbers
| Metric | Value |
|---|---|
| Total commits | 54 |
| Files changed | ~8,500 lines across 130+ files |
| Contributors | 4 (Dotta, Devin Foley, Aron Prins, scotttong) |
| Feature additions | 2 (sandbox custom images, pipeline title templates) |
| UI improvements | 3 (media gallery unification, ⌘K project ranking, accent markdown) |
| Bug fixes | 4 (heartbeat reaping, watchdog cache, server info metadata, sandbox probes) |
| Build/CI | 1 (UI type-check off critical path) |