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]>
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]>
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]>
- Replace docs footer with paperclip.ing's structure (wordmark row,
4-column grid, bottom row) and pin it to the dark palette
- Move search trigger from the left to the right of the navbar
- Load Inter Tight as a variable font so weight 450 renders correctly
- Set light-mode page background to pure white (matches paperclip.ing)
- Bind navbar text colors to --graphite (light) / --ash (dark) so dark
mode matches paperclip.ing's --mono (#9A958A) exactly
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
- Match paperclip.ing's layout frame exactly (max-width 1280, 24px padding)
- Replace navbar links with Blog/Docs to mirror the marketing site
- Add a navbar search trigger (icon + label + ⌘K kbd chip)
- Move search into a centered modal opened by the trigger or ⌘K
- Remove the sticky search sub-bar; relocate breadcrumb above article
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Replaces the docs topbar with paperclip.ing's three-column navbar
(centered logo, left nav links, right Star CTA with live count),
moves the theme toggle to a fixed bottom-right pill button, and
relocates the search bar to a sticky sub-bar directly below the
navbar.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Retunes color tokens to paperclip.ing's "materials" palette
(bond/manila/stone/charcoal/ink), swaps the display font from
Instrument Serif to Inter Tight at weight 600 / -0.03em tracking,
and tightens radii to 8/12 to match. The dark theme shifts from
cool blue-grey to warm charcoal with manila cream text.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Covers both storage shapes (plain value on the agent vs secret reference
via Company Settings → Secrets), with per-provider notes for Anthropic,
OpenAI, Google Gemini, xAI, Cursor, and OpenCode. Includes a callout for
the Claude.ai subscription → console-key switch that's been tripping up
existing users.
Co-authored-by: Claude Opus 4.7 (1M context) <[email protected]>
- OpenCode's non-sandbox default is 60s, not 45s.
- Cursor has two probes (version + hello) with different sandbox/non-sandbox
defaults.
- Grok Local does NOT have sandbox-aware probe timeouts in this release —
it ships with a flat 45s. Called out as follow-up.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
- UTF-8 partial-chunk claim was wrong: the actual fix routes bridge-channel
commands through the non-streaming exec path so the `@cloudflare/sandbox`
SDK can't drop the final stdout chunk on short shells. Adapter sessions
still stream.
- Probe-budget claim sharpened: the change is a static doubling of
`helloProbeTimeoutSec` to 90s when targeting a sandbox (45s otherwise),
not a dynamic warming-aware budget. Lives in each local adapter's
test.ts, not in the Cloudflare provider.
- Pi install fix sharpened: the actual change is a corrected npm package
namespace + version pin (`@earendil-works/[email protected].0`), not
a path inside the bridge image.
- Added the previously-missing `DEFAULT_BRIDGE_REQUEST_TIMEOUT_MS` bump
from 30s to 300s, which was also in the v2026.517.0 window.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
- New adapter page: Grok Local (`grok_local`), wired into the Adapters
overview table and nav.
- Issues guide: document locking workflow (lock/unlock, derived-document
redirect for agents) and the new Board-view scaling controls (density,
cold-lane mode, column page size). Documents are now live-refreshed.
- Issues API reference: lock / unlock endpoints, plus the
`redirectedFromLockedDocument` response for agent writes into locked
documents.
- Sandbox Providers (Cloudflare): reliability tuning notes — larger
instance type, SSE keepalives, UTF-8-safe stdout, sandbox-aware probe
budgets, corrected Pi install path.
- LLM Wiki plugin: bundled bootstrap assets and namespace-safe spaces
migration validation.
- SCREENSHOTS_PENDING.md regenerated for v2026.517.0.
- .sync-state.json bumped to v2026.517.0.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Cumulative window v2026.513.0 → 333a16b after 24h quarantine. 2 commits,
12 files, no doc-relevant surface changes. 9 commits younger than the
quarantine cutoff (Cloudflare/i18n/kanban/llm-wiki/lockfile) deferred to
a later run. Drift 0, stale screenshots 0.
Address operator confusion observed in support channels: users on
non-Docker / systemd installs report not being able to install the
LLM Wiki plugin. Root cause is documentation, not code — the plugin
is published to npm and installs cleanly via the standard CLI, but:
- Our reference page buried the npm package name in the "developing
from a checkout" subsection. Operators scanning for the install
command had to read past the dev section to find @paperclipai/...
Now the Quick install section is the first actionable thing on
the page, with the explicit `paperclipai plugin install` line.
- `paperclipai plugin examples` (and the dashboard's Available
Plugins list) only returns the four reference example plugins
from BUNDLED_PLUGIN_EXAMPLES in server/src/routes/plugins.ts. It
is NOT the full first-party catalogue. Operators who looked there
for LLM Wiki concluded it wasn't shipped. Added a callout to
docs/administration/plugins.md to make this explicit and link out
to the LLM Wiki reference page for plugins installed by full npm
name.
Co-Authored-By: Claude Opus 4.7 <[email protected]>
Three first-party plugins were missing from the docs because they
shipped before /sync-docs started tracking the repo (or were missed
in a prior batched catchup):
- NEW docs/reference/plugins/llm-wiki.md — full reference page for
the LLM Wiki plugin (introduced in v2026.512.0, PR #5716). Covers
what the plugin contributes to the dashboard, its managed agent
and skills, REST routes, and operator tips.
- docs/administration/plugins.md — adds the missing
plugin-orchestration-smoke-example bullet to the first-party
examples list (sibling to the four already listed).
- docs/reference/adapters/sandbox-providers.md — adds a Fake Sandbox
(provider: "fake-plugin") section for the private
@paperclipai/plugin-fake-sandbox package, intended for testing and
reproducing plugin-runtime issues without external infrastructure.
- site/content.json — nav entry for the new LLM Wiki page under
Reference / Plugins.
Co-Authored-By: Claude Opus 4.7 <[email protected]>
Per runbook release ceremony step 5 follow-up 4: flip branch_mode
back to "nightly" after merging main down. base_release_tag stays
at v2026.513.0 — that's the new cumulative-diff base for the next
nightly run.
Co-Authored-By: Claude Opus 4.7 <[email protected]>
Two related cleanups noticed during the v2026.513.0 release run:
1. Release ceremony was missing the nightly catch-up step. After the
release PR merges, main is ahead of nightly by the release commits
and nightly's .sync-state.json still says branch_mode "nightly"
with the old base_release_tag. The merge-down + branch_mode flip is
manual the first time and must be done by hand. Added as the 4th
post-merge follow-up, plus a troubleshooting row for the symptom
"nightly run reports release mode unexpectedly".
2. paperclip_version frontmatter was being rendered as a visible
"Documenting Paperclip vX.Y.Z" footer on every release-stamped
page. Treat the field as internal metadata only: build-release.mjs
still parses and surfaces it into content.json (queryable for
tooling), but the SPA no longer prints it on-page. Updated the
skill's builder note to match.
Co-Authored-By: Claude Opus 4.7 <[email protected]>
base_release_tag advances from v2026.512.0 to v2026.513.0.
branch_mode set to release so the state file on main reflects
the released documentation alignment after merge.
Co-Authored-By: Claude Opus 4.7 <[email protected]>
Authored docs to track the v2026.512.0 → v2026.513.0 window:
- New: docs/how-to/develop-a-plugin-locally.md — friendly walkthrough
of `paperclipai plugin init`, local-path install, dev watcher, reload.
- New: docs/guides/day-to-day/blocked-inbox.md — guide to the new
Blocked Inbox tab, chip variants, filters, sort, and triage.
- docs/guides/day-to-day/issues.md — Blocked tab cross-ref; new
"Recovery actions" and "Walking through sub-issues" sections.
- docs/reference/api/issues.md — "Recovery actions" API section
(routes, RecoveryAction shape, resolution-outcome enum).
- docs/reference/adapters/claude-local.md — "Resuming a session's
workspace" subsection (host cwd, system-root rejection, non-file
skip, driver-plugin allowlist).
- docs/reference/plugins/sdk.md — "Worker entrypoint validation"
section; version bumped to v2026.513.0.
- docs/administration/plugins.md — "Developing plugins locally"
subsection linking the new how-to.
- site/content.json — nav entries for the two new pages.
- SCREENSHOTS_PENDING.md — new UI surfaces flagged for capture.
Co-Authored-By: Claude Opus 4.7 <[email protected]>
Reorganize the operational docs into a dedicated maintenance/ folder
with two focused files plus the deferred-items tracker:
- MAINTENANCE.md (deleted) → split into:
- maintenance/maintenance.md — repo layout, commands, base paths,
pages, screenshots, publishing, and the /sync-docs design
reference (Sync workflow + Architecture diagrams).
- maintenance/runbook.md — operational guide (first-time setup,
creating the nightly branch, daily operation, release ceremony,
review workflow, helper scripts, troubleshooting).
- FOLLOW-UPS.md (deleted) → maintenance/follow-ups.md (verbatim).
Cross-references updated:
- skills/sync-docs/SKILL.md pointers to MAINTENANCE.md retargeted
to maintenance/maintenance.md (via relative path).
- Inside maintenance.md: anchor refs to Runbook subsections
(#first-time-setup, #helper-scripts-full-list) rewritten as
cross-file links to runbook.md#anchor.
- Inside runbook.md: anchor ref to Screenshots rewritten as
maintenance.md#screenshots. Heading levels demoted one level
(the section title is now top-level # Runbook). Intro paragraph
updated to reflect the standalone file.
- Inside both files: pointer paragraphs at the top linking to the
sibling file so readers can jump between design and operations.
No prose was rewritten or removed — only relocated and re-linked.
Verified zero remaining references to the old filenames across .md,
.mjs, .json, .js, .html. Build clean (90 md files). Lint-links
exit 1 only for the 3 pre-existing broken screenshot refs already
tracked in follow-ups.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Closes the gap between "MAINTENANCE.md describes the sync workflow"
and "MAINTENANCE.md is a runbook you can actually follow." Adds a
new top-level Runbook section after Sync workflow covering:
- First-time setup (prereqs, install, state seed, verify)
- Creating the nightly branch (one-time post-merge step)
- Daily operation (loop/schedule, what to expect each morning)
- Release ceremony (PR review, merge, tag, post-merge follow-ups)
- Review workflow for PENDING.md, SCREENSHOTS_PENDING.md, drift,
verification, reconcile flags
- Full helper-script list with example invocations
- FOLLOW-UPS.md role
- Troubleshooting table for common failure modes
Consolidates the previously-scattered install instructions and
helper-script list into the runbook. The Sync workflow section
remains the design reference; the Runbook is the operational guide.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Closes the four coverage gaps surfaced by the docs audit:
Gap 1 — env vars (verify-edit: 0 high-confidence unverified)
- docs/reference/deploy/environment-variables.md
- Added `BETTER_AUTH_SECRET` row to "Deployment And Auth" (falls back
to `PAPERCLIP_AGENT_JWT_SECRET`; server refuses to start without
either), and `SERVE_UI` row to "Server Configuration" (overrides
`server.serveUi`). Both values copied verbatim from parent at
v2026.512.0 (.env.example + server/src/auth/better-auth.ts).
Gap 2 — skill bundles (verify-edit: 0 unverified)
- docs/reference/skills.md
- Added one-liner entries for `diagnose-why-work-stopped`,
`paperclip-converting-plans-to-tasks`, `para-memory-files`,
`terminal-bench-loop`. Descriptions distilled from each parent
`SKILL.md` frontmatter at v2026.512.0.
Gap 3 — Plugin SDK page (verify-edit: 0 high-confidence unverified)
- docs/reference/plugins/sdk.md (new)
- site/content.json (new "Plugins" section under Reference tier)
- Comprehensive reference for @paperclipai/plugin-sdk. Every public
export (definePlugin, runWorker, startWorkerRpcHost, test harness,
bundler presets, dev server, host-client factory, JSON-RPC protocol
helpers, all manifest/protocol types, zod re-export, constants)
is listed verbatim from packages/plugins/sdk/src/index.ts at
v2026.512.0. 13 unverified items are SHOUT_CASE SDK constants
mis-classified as env vars by verify-edit (all confidence: null).
Gap 4 — REST routes (verify-edit: 0 high-confidence unverified)
- docs/reference/api/adapters.md (new) — 9 endpoints from
server/src/routes/adapters.ts.
- docs/reference/api/plugins.md (new) — install/lifecycle/config/jobs/
webhooks/local-folders/bridge endpoints from
server/src/routes/plugins.ts.
- docs/reference/api/instance-admin.md (new) — umbrella covering
instance-settings, instance-database-backups, llms reflection,
environments, and execution-workspaces.
- site/content.json — added the three new pages to the API section.
- All seven flagged route files turned out to be public/admin surfaces;
none qualified as internal-only.
FOLLOW-UPS.md
- Added "Internal REST routes — intentionally undocumented" section
recording the Gap 4 triage outcome.
Verification gates
- npm run sync:test — 26/26 passed
- npm run docs:build — clean (90 markdown files)
- npm run sync:lint-links — same 3 pre-existing broken screenshots
- npm run sync:verify-nav — same 1 pre-existing orphan
- check-drift: 41 -> 43 (+2; both are the new SERVE_UI / BETTER_AUTH_SECRET
rows hitting the known env-var-missing false-positive class tracked
in FOLLOW-UPS.md; the routes-missing item for instance-admin.md is a
filename-normalization false positive — routes exist in parent).
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>