Publish accumulated nightly drafts to main and document the new surfaces
shipped between v2026.529.0 and v2026.609.0 (130 parent commits).
New pages (gaps not covered by nightly drafts):
- docs/reference/cli/token.md — `token agent` / `token board` API-key commands
- docs/reference/cli/connect.md — interactive `connect` setup wizard
- docs/reference/api/teams-catalog.md — teams catalog REST API
Also:
- Stamp paperclip_version: v2026.609.0 on 49 release doc pages
- Register the 3 new pages in site/content.json nav
- Bump .sync-state.json base_release_tag to v2026.609.0
Verification: 49 pages checked against v2026.609.0; 11 verifier flags,
all confirmed false-positives (flagged flags/env-vars exist in parent).
Drift: 0. Reconciliation: 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
- docker.md / gemini-local.md: Gemini CLI now bundled in the official
image (GEMINI_SANDBOX=false); backfill opencode_local in bundled list
(paperclip #7693)
- external-adapters.md: external adapters can override built-in types;
document override + fallback lifecycle, correct stale 'cannot be
overwritten' note (paperclip #7394)
- regenerate PENDING.md / SCREENSHOTS_PENDING.md (18 settings/adapter
screenshots stale after instance-settings IA move, paperclip #7680)
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
`company current` exists in the CLI source
(cli/src/commands/client/company.ts) but was missing from the company
reference page. Add it to the Read Commands code block and table with a
note on how it resolves the scoped company (--company-id, context,
PAPERCLIP_COMPANY_ID, or agent credential) and that it returns the same
full record as `company get <companyId>`.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Three settled surfaces aged past the 24h quarantine since the last run:
- Teams Catalog (#7550): new `teams` CLI page + Team Catalog guide for the
installable bundled/optional starter teams.
- Company Artifacts (#7621): new Artifacts guide + `GET /api/companies/{id}/artifacts`
API section under Companies.
- Low-trust review containment / trust presets (#7530): new Administration page
covering the `standard` / `low_trust_review` presets and quarantine-then-promote
review flow.
Nav merged in site/content.json. PENDING.md and SCREENSHOTS_PENDING.md regenerated
(40 screenshots stale in the settled window). Phase 5.5 verification clean; drift clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Cumulative window v2026.529.0 → e78c064 (24h-quarantined nightly cutoff).
Three user-visible surfaces newly documented this run:
- skills: app-shipped catalog now supports *referenced* entries fetched from
an external GitHub repo pinned to a commit (CatalogSkill.source). First one
is the research-category last30days skill. Documented in the Skills
reference and the org Skills guide.
- routines: scheduled ticks are suppressed (recorded as skipped, no backfill)
while the routine's project is paused.
- companies: archiving runs a cascade that pauses active agents
(pauseReason company_archived) and cancels queued wake-ups.
All claims verified against parent code (Phase 5.5 clean). Build + link/nav
checks pass; no drift. Teams Catalog, company-artifacts page, and low-trust
review containment are quarantined (<24h) and deferred to the next run.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Closes the gap this run surfaced: packages/skills-catalog/** was unwatched, so
new bundled catalog skills (e.g. the wireframe product skill) weren't auto-detected.
Watches catalog/**/SKILL.md + generated/catalog.json, routes to docs/reference/skills.md
and docs/guides/org/skills.md (PR tier), distinct from the agent-skills watcher which
covers the server-forced bundled skills under skills/**.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Released v2026.529.0 docs to main (PR #19). Advance the cumulative-diff
base so the next nightly run diffs from this release, not v2026.525.0.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Recapture the 82 stale screenshots (light + dark, 1440×900 @2x) against
a release-code instance booted at v2026.529.0 (911a1e8). Registry was
already stamped at that SHA, so captured_sha is unchanged.
Verification pass against the release codebase also found one authored
claim wrong: the execution-workspace environment precedence is
issue → project → agent → instance default (project policy outranks an
agent's own default), not issue → agent → project. Corrected
docs/guides/projects-workflow/workspaces.md to match
server/src/services/execution-workspace-policy.ts.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Add the two release features quarantined from nightly, and stamp
paperclip_version on every touched page.
- Claude Local: document UI-driven live model discovery (#6953) —
/v1/models lookup via ANTHROPIC_API_KEY, 60s cache, built-in fallback,
Bedrock IDs, and the refresh control.
- Workspaces: document reused-workspace environment consistency and
finalize-gated dependent wakes / interaction.accept (#6969).
- Stamp paperclip_version: v2026.529.0 on all 14 touched pages.
- Regenerate SCREENSHOTS_PENDING.md: 90/276 stale for this window.
Inherits the six features already drafted on nightly: resource
memberships (#6677), document annotations (#6733), bundled plugins in
plugin manager (#6734), skills CLI + catalog (#6782), first-admin
claim (#6755).
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
The seeded org agents were created as `process` adapters with an empty
adapterConfig. The screenshot instance runs with no LLM provider and the
scheduler heartbeats every enabled agent, so each agent's heartbeat failed
instantly — the captured UI was dominated by red "error" states ("5 errors"
on the dashboard, "Ada failed after 1 second" on agent detail).
Give every demo agent a shared DEMO_AGENT_CONFIG: a process command that
always exits 0. Heartbeats now complete cleanly, so agents render as healthy
idle/running/paused with tidy transcripts. Recaptured all targets (light +
dark) against paperclip 911a1e8 — dashboard now reads "0 errors".
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
New scripts/sync/verify-screenshots.mjs asserts that every screenshot
referenced in a guide page is (a) a CAPTURE_TARGET in routes.mjs and (b)
indexed in registry.json with a non-empty depends_on. It exits non-zero
otherwise, so a doc image added without a capture target fails loudly instead
of silently going stale. Wired into `npm run sync:check`, which the /sync-docs
skill runs every sync.
Currently: 112 referenced screenshots, all tracked and indexed.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Previously sync-registry only *updated* existing registry entries, so a newly
introduced screenshot target was captured but never indexed — and the
/sync-docs staleness check only flags entries it can see, so such a shot would
silently drift out of date (exactly what happened to issues/inbox-unread).
sync-registry now appends a registry entry (file, theme, viewport, route,
depends_on) for any CAPTURE_TARGET that has none, and sorts entries for stable
diffs. run.mjs runs sync-registry on every capture, so the index now stays
complete automatically. Audit: 0 target files missing from the registry, 0
without depends_on — every documented screenshot is tracked for staleness.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Refresh the shots unlocked by the runner-agent seeding and new targets:
agent runs/transcript/status, environment test pass, approval revision box,
adapter health rows, and the onboarding goal field. registry.json stamped.
Every screenshot referenced in the docs is now captured against the current
build; the only un-refreshed files are unreferenced orphans.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Close the remaining gap so every screenshot referenced in the docs is current.
seed.mjs — process-adapter "runner" agents (no LLM needed; the process adapter
executes a shell command):
- "Task Runner" runs `sh -c "echo ..."` → a real completed run with a STDOUT
transcript (run-transcript-view, test-environment-success via the config
Test button which now passes: command sh is executable)
- "Live Task" runs `sh -c "sleep 3600"` and is woken last, so it stays
in-flight through the whole capture phase → genuine "running" agent status
and an in-progress run row
routes.mjs — targets for run-transcript-view, run-history-in-progress,
agent-status-running, test-environment-success (click "Test" → wait for the
Passed result), approvals/revision-request-input (the detail note box),
adapters/health (the adapter rows), and onboarding/goal-field (wizard step 1).
dashboard.md — the dashboard image pointed at a hand-annotated PNG that can't
be auto-captured; repoint it to the freshly captured dashboard-overview.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Full automated recapture via the extended pipeline against a richly-seeded
demo instance: 220 screenshots (110 targets x light/dark, 1440x900 @2x).
Adds coverage for dashboard, tasks, activity, org chart, routines, skills,
workspaces, approvals, budget-utilisation states, new-agent forms, and
empty-state onboarding. registry.json route/depends_on backfilled and
captured_sha stamped for all 220 entries.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Grow capture coverage from 56 to 110 targets so the docs' UI screenshots are
refreshed end to end, not just the plain-URL surfaces.
capture.mjs — interaction engine:
- `steps` per target (click / fill / waitFor / press) run after the page
settles; each step is best-effort (logs + continues) so selector drift
degrades to a partial capture instead of aborting
- `clip` captures a single element (e.g. a dashboard panel), falling back to
full-page if the element isn't found
- robust locator DSL: testid / role+name / label / title / placeholder / text / css
routes.mjs — +54 targets across dashboard, tasks, issues, activity, org,
routines, skills, workspaces, settings, costs (incl. budget-bar 50/80/100%
states), new-agent forms, approvals, and empty-state onboarding. New seed-id
tokens for empty company, budget-state agents, http agent, skill, approvals.
Documents the 8 shots that are genuinely not auto-capturable offline (live-run
transcripts/status, real adapter test-pass, a nonexistent revision input, a
nonexistent adapter-health route, the hand-annotated overview, onboarding goal).
seed.mjs — extended dataset: a second empty company for empty-state shots;
three budget-utilisation agents seeded to 50/80/100% (last one paused); an
http-adapter agent; four approval items (hire / strategy / board / approved)
via REST; a resolved skill id; and the isolated-workspaces experimental flag
(PATCH /api/instance/settings/experimental).
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Full automated capture of the docs UI screenshots (light + dark, 1440x900 @2x)
via `npm run screenshots:refresh`, run against a fresh seeded demo instance.
- 112 PNGs (56 light + 56 dark) refreshed across all covered surfaces
- registry.json: route + depends_on backfilled for the 110 captured entries,
captured_sha/captured_against stamped to the parent commit they were taken at
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Validated the pipeline against a live local_trusted instance and fixed what
the dry run surfaced, plus made the demo company look genuinely in-use.
seed.mjs — rich, idempotent, soft-failing demo dataset:
- brand color + monthly budget; 5-agent org (Ada/Bob/Cleo/Dax/Eve) with
titles, icons, instructions, per-agent budgets, assigned skills
- 4 company skills, 2 goals, 2 projects + a git workspace, 8 issues with
mixed statuses/priorities/assignees, 2 sub-issues, a 4-message chat thread
- routine + one execution-history row, 2 invites, bundled plugins installed,
32 cost events + 5 finance events so the Costs/Finance dashboards are non-zero
- enum/validation fixes from the live run: goal status "active" (not
"in_progress"), workspace sourceType "git_repo", comment authorType "user"
(a board actor cannot post as "agent")
run.mjs:
- kill the server's whole process group on teardown (was orphaning the
server child and holding port 3197)
- pre-clean the scratch home at startup so every run gets a fresh DB and the
one-shot seed steps (comments/invites/events) always fire
sync-registry.mjs: drop the scaffolder's _todo note once route/depends_on
are populated.
package-lock.json: pick up @playwright/test.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Builds an end-to-end pipeline that keeps docs screenshots in sync with the
latest Paperclip build, replacing the previously-manual capture step.
scripts/screenshots/:
- config.mjs isolated-instance env helpers (local_trusted/loopback,
scratch PAPERCLIP_HOME, never touches ~/.paperclip)
- seed.mjs idempotent demo-data seeding via REST (company/agents/
project/goal/issues/routine/workspace); writes .seed-ids.json
- routes.mjs 56 CAPTURE_TARGETS with real ui/src depends_on paths;
resolveRoute() uses the server-derived issuePrefix
- capture.mjs Playwright capture (light+dark, 1440x900 @2x), theme seeded
to match ui/index.html, stamps registry captured_sha
- sync-registry.mjs back-fills route + depends_on into registry.json
- run.mjs one-command orchestrator: onboard -> health -> seed ->
sync-registry -> capture -> teardown
- README.md prerequisites, flow, overhaul mode, safety notes
Wiring:
- package.json: screenshots:{seed,capture,sync-registry,refresh,refresh:all}
+ @playwright/test devDependency
- screenshots:refresh:all is the full re-take mode for major UI/UX overhauls
- sync-docs SKILL.md Phase 6: capture is now automatable (still PR-reviewed,
never auto-pushed); maintenance.md updated to match
- .gitignore: scripts/screenshots/.seed-ids.json
Auth is free in local_trusted mode (every request is admin), so no login flow
is needed. Capture/staleness still surface to a PR for human review.
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
* style: align docs site with paperclip.ing brand guide
Bring the docs site in line with the canonical brand tokens and fix two
layout bugs found while verifying:
- Radius scale: adopt the brand ramp (xs 4 / sm 10 / md 16 / lg 24 / pill)
and apply by role (cards 16, controls/code/tables 10, chips/code 4,
search modal 24).
- Pill rule: reserve the pill shape for the primary Star CTA only; convert
secondary controls (search, TOC toggle, copy-link group) to 10px rects
and metadata/count chips to 4px.
- Color: error red -> #DC2626, complete the named status palette, align
callout deeps and dark-mode secondary/muted text to brand exact hexes.
- Typography: enable OpenType ss01 + cv11 on body, tabular-nums on mono,
tighten display-1 tracking to -0.04em.
- Default to dark mode (set pre-paint in <head> to avoid a light flash).
- Fix "All docs" sidebar button clipped on the left by overflow-x.
- Fix doc body width: set --content-max to 920px so content fills the
layout and lines up with the header/footer.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* fix(nav): rework mobile top bar layout
On mobile (<=560px) the top bar is now balanced and centered:
- hamburger moved to the far left, with the search trigger beside it
- paperclip icon + wordmark + "Docs" stay dead-centered
- GitHub icon sits left of the Star button on the right
- drop the star count on mobile so the side groups balance and the
logo centers via flex (no overlap)
Search is duplicated for the left/mobile slot and both triggers bind via
a shared .js-search-open class. Desktop layout is unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* fix(nav): prevent header overflow on very narrow phones
Hide the "Docs" logo suffix at <=360px. With the mobile search + GitHub
buttons shown, the min content width of hamburger+search | Paperclip Docs
| GitHub+Star was ~352px, overflowing viewports around 320px. "Docs"
stays visible on common phones (375px+).
Addresses Codex review P2.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
* fix(a11y): raise dark muted-text contrast to WCAG AA
Dark --ash was set to the brand caption color #6E6960 (~3.4:1 on the
dark bg), but --ash is reused for normal-size text (navbar links,
counts, metadata, placeholders). Raise to #8A8579 (~5:1, AA) while
keeping it dimmer than the secondary text token.
Addresses Codex review P2.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
Cumulative nightly sync from v2026.525.0 → parent master b754582:
- New API page for resource memberships (join/leave projects & agents)
- Document annotations API + guide sections on issue documents
- Bundled plugin discovery (experimental first-party plugins) in admin + API docs
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Adds docs/how-to/update-paperclip.md covering the three install paths
(Desktop App, npx/CLI, git clone) and wires it into the How-to Guides
sidebar.
Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
Absorbs the squash-merged release commit so nightly's base is aligned
with main. Tomorrow's nightly sync will diff against v2026.525.0.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
# Conflicts:
# .sync-state.json
# docs/reference/adapters/modal.md
# docs/reference/plugins/sdk.md
# docs/reference/plugins/workspace-diff.md
Drop the "control plane" buzzwords. Short noun-phrase headline,
plain-language lede that echoes paperclip.ing's "people use to
manage AI agents for work" cadence.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
The pill button now copies the canonical page URL (with hash); the
dropdown's first item still copies the page as Markdown.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
- Load italic axis for Inter Tight/Inter from Google Fonts so #landing-title em renders true italic instead of synthetic slant
- Drop the dimmed graphite color on em; inherit ink to match paperclip.ing
- Remove the green left-edge ::after strip on .card (and its hover state)
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
When the header was rewritten the id was dropped, so init()'s
document.getElementById('logo').href = ... threw and halted the
rest of the boot sequence (sidebar, landing, routing).
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>