为Paperclip新增或扩展贯穿真实浏览器、服务器、数据库和runner的端到端评估,整理测试数据、判定条件与证据,并在现有报告中查看操作结果。
- 新增完整用户操作流程的评估
- 更新测试数据与判定条件
- 在评估报告中加入截图和产物
通过受管服务启动和修复Paperclip隔离开发环境,按需完整克隆数据库,并核验登录、克隆数据、运行状态及端口进程所属的工作目录。
Run, verify, reseed, and repair Paperclip isolated dev workspace services. Use when asked to start or fix a managed project/worktree service and prove health, login readiness, cloned data, runtime visibility, and correct port ownership.
通过受管服务启动和修复Paperclip隔离开发环境。必要时,从主实例重新完整克隆数据库,检查初始化是否完成、常用开发凭据能否登录,以及克隆数据是否显示。同时核对主实例和开发环境中的运行状态,并检查占用端口的进程是否属于目标工作目录。
适用于开发环境无法启动、出现初始化页面,或登录后数据为空的情况。服务显示正常却打开另一个工作环境时,也可用于调查端口冲突。不会仅凭健康检查通过就认定修复完成。
需要Paperclip专用的受管环境、CLI和API凭据。端口归属检查使用lsof及Linux的/proc/<pid>/cwd。修复不涉及主代码检出目录及其.env,并保留用户的改动。无法启动浏览器时,会请QA核验页面和登录,并明确列出尚未核验的事项。
本介绍由 AI(OpenAI Codex)根据公开的 SKILL.md 撰写。准确的规格请查看下方原文。
AI 仅根据 SKILL.md 的内容,从 4 个方面进行了评估。星标数和热度不计入评估。
总分按每项 A=25 分、B=15 分、C=5 分相加。 由 AI(OpenAI Codex)于 2026年10月20日 评估。仅供参考,安装前请同时查看原文。
安装前可以查看交给 AI 代理的指令内容。
This skill is for Paperclip-specific development workspaces whose service is
started through project execution workspace runtime services, typically a
worktree service such as paperclip-dev.
Success means all of these are true:
/api/health returns status: ok and bootstrapStatus: ready200 and does not show the first-admin setup gaterunning / healthy with the
expected URLrunning / healthyreadlink /proc/<pid>/cwd resolves inside the target worktree,
not a sibling workspaceIf any item fails, keep fixing. Do not mark the issue done because one probe passed.
/srv/paperclip/home/paperclipai/paperclip (the primary
repo with the real instance .env) is never a workspace repair target. Never
point a worktree runtime service at it, never git worktree add into it or
under <master>/.paperclip/worktrees/, and never edit its .env while
repairing a workspace. Managed workspaces run in their own folders, for
example ~/.paperclip-worktrees/instances/<slug>/….running / healthy runtime row or a passing /api/health
alone. The service:paperclip-dev port is pinned in service config, so a
sibling workspace's process can own the port and still answer health checks.
Confirm the port owner's real cwd (readlink /proc/<pid>/cwd) before and
after every repair; the runtime row's recorded cwd and pid can be
fabricated by port adoption.doc/DEVELOPING.md before running Paperclip CLI, dev server, worktree,
database, build, or test commands.psql, raw embedded-Postgres commands, or
ad hoc row copying for the normal fix path.pnpm dev or detached shell
processes when the task is about a reusable workspace service.Use environment variables when available. Do not print API keys or passwords.
PAPERCLIP_API_URL: main control-plane API URLPAPERCLIP_API_KEY: agent API keyPAPERCLIP_RUN_ID: current run id for runtime-service mutationsPAPERCLIP_TASK_ID: current issue idPAPERCLIP_COMPANY_ID: company idPAPERCLIP_AGENT_ID: current agent idservice:paperclip-devhttp://paperclip-dev:40631If the execution workspace id or service command id is missing, read the issue, project, or execution-workspace API records first. Do not guess and start an unmanaged server on a random port.
Use this when the user says to start the workspace, start it again, or fix a workspace that should be freshly ready.
Use the runtime-service endpoints on the main control plane. Include
X-Paperclip-Run-Id so the mutation is associated with the current heartbeat.
curl -sS -X POST \
"$PAPERCLIP_API_URL/api/execution-workspaces/$EXECUTION_WORKSPACE_ID/runtime-services/stop" \
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
-H "Content-Type: application/json" \
--data-binary '{"workspaceCommandId":"service:paperclip-dev"}'
curl -sS -X POST \
"$PAPERCLIP_API_URL/api/execution-workspaces/$EXECUTION_WORKSPACE_ID/runtime-services/start" \
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
-H "Content-Type: application/json" \
--data-binary '{"workspaceCommandId":"service:paperclip-dev"}'
If the API returns an existing service, treat that as a candidate only. Verify
its real /api/health and its port-owner identity before trusting it.
service:paperclip-dev pins an explicit port in service config, so every
workspace that realizes that service claims the same port. On start, service
adoption will adopt whatever process already owns the port when its command
line looks similar — and it records the requested cwd, not the owner's real
cwd. Two consequences:
running rows for the same port while only one
process exists; whichever workspace URL you open, you get that one processcwd, pid, and health can all look correct while the
URL actually serves a sibling worktree's appIdentity check — run this before trusting any existing service and again after every start or restart:
pid=$(lsof -nP -iTCP:"$SERVICE_PORT" -sTCP:LISTEN -t | head -1)
readlink "/proc/$pid/cwd"
The resolved cwd must be inside the target worktree (the dev server usually
runs in <worktree>/server). Only /proc/<pid>/cwd is authoritative. Do not
accept the runtime row's cwd field, a root 200, or a healthy /api/health
as proof of identity — a squatting sibling passes all three.
If the port owner is a sibling workspace's process (port squat):
/proc/<pid>/cwd, the sibling execution-workspace records, and the owning
issue/run state; do not infer ownership from the target runtime row.curl -sS -X POST \
"$PAPERCLIP_API_URL/api/execution-workspaces/$EXECUTION_WORKSPACE_ID/runtime-services/restart" \
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
-H "X-Paperclip-Run-Id: $PAPERCLIP_RUN_ID" \
-H "Content-Type: application/json" \
--data-binary '{"workspaceCommandId":"service:paperclip-dev"}'
Before declaring success, also fetch the sibling workspaces you suspect and
compare their runtimeServices[].port values: more than one running row
claiming the target port across workspaces is always a conflict to resolve,
not a state to work around.
Use a full reseed when the app says setup is incomplete, login works but data is missing, the cloned app does not have the expected companies/issues/agents, or the user explicitly asks for the normal isolated-workspace database.
npx paperclipai worktree reseed --from-instance default --seed-mode full --yes
After reseed, restart through the managed runtime path. A reseed can copy runtime-service rows whose ids no longer match the local process registry, so runtime adoption and reconciliation must be verified after the start.
Do not consider the reseed complete until the served app has both auth and populated product data. A one-off inserted user/account row is a diagnostic clue, not the final state.
Set SERVICE_URL to the service URL returned by the runtime API.
curl -sS "$SERVICE_URL/api/health" | jq
curl -sS -I "$SERVICE_URL/" | head
Expected health:
status: "ok"bootstrapStatus: "ready"bootstrapInviteActive: falseFailures to reject:
bootstrap_pending: the instance will show the first-admin setup gatedatabase_unreachable: a web process is listening but its database is dead200 with unhealthy /api/health: stale process adoption bug or a
dead embedded database behind a live Node processCheck the port owner when a process is already listening:
lsof -nP -iTCP:"$SERVICE_PORT" -sTCP:LISTEN || true
Use this only to identify and remove a stale matching Paperclip dev-runner process after managed stop fails. Do not kill unrelated processes.
Read the execution workspace from the main API and inspect the runtime service record.
curl -sS \
"$PAPERCLIP_API_URL/api/execution-workspaces/$EXECUTION_WORKSPACE_ID" \
-H "Authorization: Bearer $PAPERCLIP_API_KEY" | jq
The target service should show:
service:paperclip-devstatus: "running"If the main app says running but /api/health is bad, stop and replace the
stale process through the managed runtime.
The cloned Paperclip app must also know about the service. Query the same execution workspace through the served app when agent auth is available there:
curl -sS \
"$SERVICE_URL/api/execution-workspaces/$EXECUTION_WORKSPACE_ID" \
-H "Authorization: Bearer $PAPERCLIP_API_KEY" | jq
The served app should agree that the service is running / healthy at the
same URL. If the main control plane and served app disagree after a reseed,
the cloned database may contain copied runtime-service ids that do not match
the local process registry. Use the normal start/adoption path again and verify
both sides. If code changed in this area, add a focused regression test.
Auth and data checks should use product APIs and browser/QA review, not raw DB queries.
Minimum API checks:
curl -sS "$SERVICE_URL/api/health" | jq '.status, .bootstrapStatus'
curl -sS "$SERVICE_URL/api/companies" \
-H "Authorization: Bearer $PAPERCLIP_API_KEY" | jq
curl -sS "$SERVICE_URL/api/agents/me" \
-H "Authorization: Bearer $PAPERCLIP_API_KEY" | jq
Then verify at least one expected cloned product record through the API, such as a known project, issue key, company, or execution workspace that should exist in the primary instance. Pick a record relevant to the current issue rather than a random table count.
Browser or QA check:
If this environment cannot launch a browser, ask QA to do the visual/login check and still complete all API checks you can run. Report that browser verification was delegated and why.
Symptom: the workspace URL loads a working Paperclip app, but it is a sibling worktree's app — wrong branch, wrong data, or the UI keeps bouncing you into another workspace's pages.
Likely cause: the pinned service port is owned by another workspace's process and start-time adoption attached that process to this workspace's runtime row. Health checks pass because the sibling app is genuinely healthy.
Fix: follow the owner-first procedure in "Port conflicts and workspace
identity": identify and stop the sibling service or supervising run, verify
the port stays free, then start or restart the target service. Re-verify that
/proc/<pid>/cwd of the new port owner resolves inside the target worktree.
Verify: identity check passes, and one workspace-specific record served through the URL (branch, issue key, or workspace id) matches the target workspace.
Symptom: the runtime row and the actual listener disagree about the port, or a previously pinned port changed after someone started the app by hand.
Likely cause: an unmanaged pnpm dev (for example with --bind lan) picks its
own port instead of using the managed pinned port.
Fix: stop the unmanaged process, then managed start. Verify the recorded URL port equals the bound port and the identity check passes.
Symptom: the page says no admin has claimed the instance.
Fix: run a full worktree reseed from the primary instance, then restart the managed service. Claiming a first admin can clear the gate, but if the user asked for the normal isolated workspace database, full reseed is the correct fix.
Verify: /api/health has bootstrapStatus: ready, login works, and populated
data exists.
Symptom: bootstrap is ready, but the user's normal dev credentials do not work.
Likely cause: the isolated DB has roles or bootstrap state but lacks the primary instance auth users/accounts.
Fix: full reseed. Do not manually copy only Better Auth user/account rows as the final fix.
Verify: user login through browser/QA and /api/agents/me with the agent key.
Symptom: user can sign in, but companies/issues/projects/runs are empty or clearly incomplete.
Likely cause: a partial auth repair was done instead of a full cloned database.
Fix: full reseed, managed restart, then verify representative cloned records.
Symptom: curl -I / returns a response, but /api/health reports
database_unreachable.
Likely cause: stale Node/web process remained alive after embedded Postgres died.
Fix: managed stop first. If the process survives, identify the matching Paperclip dev-runner process group for the target port and terminate only that group. Then managed start.
Verify: /api/health is ok after a stability wait and the runtime record is
healthy.
Symptom: the service URL works, but the main app says the service was not created or is stopped.
Likely cause: detached workaround process, stale provider ref, or service adoption trusted the root URL instead of health.
Fix: shut down the unmanaged process and restart through the managed runtime.
If code repair is needed, ensure adoption checks /api/health, replaces
unhealthy adopted processes, and records the current provider ref.
Verify: main runtime row and /api/health agree.
Symptom: the main app sees paperclip-dev running, but the cloned app copied a
runtime-service row whose id does not match the local registry.
Likely cause: normal DB clone copied persisted runtime rows from the primary instance into an isolated environment with different local process metadata.
Fix: use managed start/adoption again. If code repair is needed, adoption should reconcile by service identity and port, not only by copied row id.
Verify: main app and served app both show the same service as
running / healthy.
Symptom: starting from the served app returns 403 or a mutation partially
applies before activity logging fails.
Likely causes: the cloned issue/run/agent state does not match the current heartbeat, or the run id is absent in the cloned database after reseed.
Fix: prefer the main control-plane managed runtime path and full reseed. If the cloned app state itself must be repaired, use normal Paperclip issue/run transitions first. Do not hide the condition with raw DB edits; report the exact guard or missing row if it blocks the normal path.
Each of these has burned a previous repair; check them before deep debugging.
~/.paperclip-worktrees/instances/<slug>/logs. Read them before guessing at
login or startup failures.403 while
127.0.0.1 (or the paperclip-dev hostname) works. Probe loopback first
before concluding auth is broken./FOR/...)
should switch to a company key that exists in the cloned data (for example
/PAP/...) before concluding the reseed failed.409 on runtime or issue mutations usually means another live run holds
the ownership lock. Do not force it; wait or coordinate through the issue.Make a code change only when the normal operational repair exposes a product bug. Examples from this failure class:
lsof arguments200 instead of /api/health/proc/<pid>/cwd, so a sibling workspace's process was adoptedAdd focused tests in the affected service test file. For workspace runtime repairs, the narrow verification is usually:
pnpm exec vitest run server/src/__tests__/workspace-runtime.test.ts
git diff --check
Commit logical code changes and link the commit in the issue comment. If no tracked code changed, say so explicitly.
Use concrete evidence, not a vague "it works".
Fixed and verified the workspace service.
Root cause:
- <why it broke>
Fix:
- <normal reseed/start/repair steps>
- <code commit if any>
Verified:
- main control plane shows <service> running/healthy at <url>
- served workspace app shows the same service running/healthy
- port owner identity: /proc/<pid>/cwd resolves inside the target worktree
- <url>/api/health is ok with bootstrapStatus ready
- root page returns 200 and no setup gate
- dev login verified by <agent browser / QA / user> without posting credentials
- cloned data verified via <specific API records>
- targeted tests: <commands>
Remaining:
- <none, or named owner/action if blocked>
Mark the issue done only when every success-condition item is satisfied. If
not, mark blocked with a named unblock owner and the exact action needed.
还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
为Paperclip新增或扩展贯穿真实浏览器、服务器、数据库和runner的端到端评估,整理测试数据、判定条件与证据,并在现有报告中查看操作结果。
为Paperclip Runner添加或扩展行为评估,定义判定条件、执行目标和报告验证数据,利用正常及异常证据验证结果,并保留执行记录与费用。
通过实际浏览器操作网页和应用,检查界面显示与运行情况。结合截图、简单表单填写、错误及网络请求记录,帮助复现问题并确认操作结果。
通过 Paperclip 分配的 AgentMail 收件箱,查看任务关联邮件、发送新邮件或回复,并核查投递结果;重试时保留相同标识,避免重复发送。
检查GitHub、GitLab和Perforce变更中的评审意见、自动检查失败及说明缺漏,整理待办事项,并按请求协助修改和解决已处理的讨论。
根据构想或现有代码仓库,梳理AI智能体的职责、汇报关系与工作交接,生成符合规范的公司或团队文件包,供组织协作和导入Paperclip使用。