{"record":{"id":"67db43c17da96088","repo":"paperclipai/paperclip","slug":"invalid-object-key","errorCode":null,"errorMessage":"Invalid object key.","messagePattern":"Invalid object key\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/src/commands/worktree.ts","lineNumber":332,"sourceCode":"function resolveWorktreeStartPoint(explicit?: string): string | undefined {\n  return explicit ?? nonEmpty(process.env.PAPERCLIP_WORKTREE_START_POINT) ?? undefined;\n}\n\ntype ConfiguredStorage = {\n  getObject(companyId: string, objectKey: string): Promise<Buffer>;\n  putObject(companyId: string, objectKey: string, body: Buffer, contentType: string): Promise<void>;\n};\n\nfunction assertStorageCompanyPrefix(companyId: string, objectKey: string): void {\n  if (!objectKey.startsWith(`${companyId}/`) || objectKey.includes(\"..\")) {\n    throw new Error(`Invalid object key for company ${companyId}.`);\n  }\n}\n\nfunction normalizeStorageObjectKey(objectKey: string): string {\n  const normalized = objectKey.replace(/\\\\/g, \"/\").trim();\n  if (!normalized || normalized.startsWith(\"/\")) {\n    throw new Error(\"Invalid object key.\");\n  }\n  const parts = normalized.split(\"/\").filter((part) => part.length > 0);\n  if (parts.length === 0 || parts.some((part) => part === \".\" || part === \"..\")) {\n    throw new Error(\"Invalid object key.\");\n  }\n  return parts.join(\"/\");\n}\n\nfunction resolveLocalStoragePath(baseDir: string, objectKey: string): string {\n  const resolved = path.resolve(baseDir, normalizeStorageObjectKey(objectKey));\n  const root = path.resolve(baseDir);\n  if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {\n    throw new Error(\"Invalid object key path.\");\n  }\n  return resolved;\n}\n\nasync function s3BodyToBuffer(body: unknown): Promise<Buffer> {","sourceCodeStart":314,"sourceCodeEnd":350,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/cli/src/commands/worktree.ts#L314-L350","documentation":"Canonicalization guard for storage object keys: after normalizing backslashes and trimming, the key is empty, rooted (leading '/'), or contains '.'/'..' path segments, so it cannot map safely into a flat storage namespace.","triggerScenarios":"Thrown at cli/src/commands/worktree.ts:299 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use a valid object key format."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}