paperclipai/paperclip · error · Error
Source and target Paperclip configs are the same canonical…
Error message
Source and target Paperclip configs are the same canonical file.
What it means
resolveRegisteredWorktreeSeedSource canonicalizes both the source config and the target worktree config and found them identical: the seed operation's destination is the same file as its source. Seeding would overwrite its own origin, so the invariant check rejects it.
Solutions
- Run the command from the new worktree directory (or pass its path) so the target config is the worktree's own, not the base's.
- Verify `realpath <target>/.paperclip/config.json` differs from the source config.
- If --from-config was meant to seed this worktree, make sure the worktree's own config.json path is the target, not the source file.
Example fix
# before (run inside the base workspace) paperclip worktree seed --from-config ./.paperclip/config.json # target == source # after (run inside the new worktree) cd ../worktrees/issue-42 && paperclip worktree seed --from-config "$(realpath ../../base/.paperclip/config.json)"
Defensive patterns
Strategy: validation
Validate before calling
import { realpathSync } from "node:fs";
const src = realpathSync(sourceConfigPath);
const dst = realpathSync(targetConfigPath);
if (src === dst) throw new Error("refusing to seed a worktree onto itself"); Type guard
const isDistinctTarget = (src: string, dst: string): boolean => {
try { return realpathSync(src) !== realpathSync(dst); } catch { return false; }
}; Prevention
- Always run seed commands from the new worktree, never the base workspace.
- Assert `process.cwd() !== baseWorkspaceCwd` in seed wrappers.
- Guard CI scripts that interpolate `$PWD` into both source and target.
When it happens
Trigger: Running worktree seed from inside the base workspace with the target worktree path resolving to the base itself; passing --from-config equal to the target worktree's config; a target cwd that symlinks back to the base (both canonicalize to one path).
Common situations: Invoking the seed command in the wrong directory (base instead of the new worktree); CI scripts reusing `$PWD` for both source and target; misconfigured worktree root pointing at the checkout root.
Related errors
- Explicit source Paperclip config does not match the…
- does not exist at .
- is not a regular file at .
- Registered base project workspace has no Paperclip config…
- Registered base project workspace Paperclip config at
AI-assisted analysis of paperclipai/paperclip@a7e689b3c3 (2026-08-21).
Data as JSON: /api/errors/50f313673164eced.
Report an issue: GitHub.
Appendix: source
Thrown at packages/shared/src/worktree-seed-source.ts:171
}
const canonicalSourceConfigPath = canonicalRegularFile(selectedPath, "Registered source Paperclip config");
if (registeredConfigPath && canonicalSourceConfigPath !== registeredConfigPath) {
throw new Error("Registered source Paperclip config escapes the base project workspace or uses a symlink alias.");
}
if (explicitSource) {
const canonicalExplicitSource = canonicalRegularFile(explicitSource, "Explicit source Paperclip config");
if (canonicalExplicitSource !== canonicalSourceConfigPath) {
throw new Error("Explicit source Paperclip config does not match the registered base project workspace.");
}
}
const canonicalTargetConfigPath = canonicalRegularFile(
input.targetConfigPath,
"Target worktree Paperclip config",
);
if (canonicalSourceConfigPath === canonicalTargetConfigPath) {
throw new Error("Source and target Paperclip configs are the same canonical file.");
}
const sourceInstanceId = readInstanceId(canonicalSourceConfigPath, "source");
const targetInstanceId = readInstanceId(canonicalTargetConfigPath, "target");
if (targetInstanceId !== input.expectedTargetInstanceId) {
throw new Error("Target Paperclip instance does not match the registered worktree instance.");
}
if (sourceInstanceId === targetInstanceId) {
throw new Error("Source and target Paperclip configs name the same instance.");
}
return {
baseWorkspaceCwd: canonicalBaseCwd,
configPath: canonicalSourceConfigPath,
instanceId: sourceInstanceId,
targetConfigPath: canonicalTargetConfigPath,
targetInstanceId,
};View on GitHub (pinned to a7e689b3c3)