chore(release): staging to production - 2026.03.02 - #981
Conversation
…ncrement in updateChatflow - rollbackToVersion() now accepts newVersion parameter instead of computing it from the stale old record's currentVersion, ensuring DB and storage stay in sync - updateChatflow() now increments currentVersion before merge/save when flowData changes, so each edit creates a properly-numbered version file (matches pattern already used in bulkUpdateChatflows)
…ack-did-not-seem-to-work fix(chatflows): fix version number mismatch in rollback and missing increment on update
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…oyment - CVE-2025-29927 (next): Updated to 14.2.21 - CVE-2025-7783 (form-data): Updated to 4.0.5 - CVE-2025-47935, CVE-2025-47944, CVE-2025-7338, CVE-2025-48997 (multer): Pinned to 2.0.2 - CVE-2025-59343 (tar-fs): Updated to 3.1.2 - CVE-2025-59288 (playwright): Updated to 1.49.2 - CVE-2025-27152 (axios): Updated to 1.7.9 All updates applied via pnpm overrides to ensure consistent versions across monorepo. Run 'pnpm install' to apply these updates before deployment.
…atched version)
…er-error-to-connect-credentials-despite feat(billing): UsageBridge — fire-and-forget execution cost reporting
PR Review: chore(release): staging to production - 2026.02.26PR: staging -> production (auto-generated release PR) Summary: This PR contains three targeted fixes across the chatflow versioning pipeline and the document store UI. The changes improve resilience around S3 storage operations by making them non-blocking, fix a version number sequencing bug in the rollback flow, and resolve a credential synchronization issue in the document loader preview. Overall the changes are sound, but there are a few observations worth noting. Critical IssuesNone identified. No security vulnerabilities, no missing enforceAbility middleware (no new routes added), and no unfiltered database queries were introduced. Major Concerns1. Silent S3 failures could mask data integrity problems Location: packages/server/src/services/chatflows/index.ts (saveChatflow, updateChatflow, rollbackChatflowToVersion) The PR wraps all S3 saveVersionedChatflow and rollbackToVersion calls in try/catch blocks that log errors and continue. This is a deliberate trade-off (keeping the DB write authoritative), but it means version history in S3 can silently diverge from the DB state with no alerting or retry mechanism. The concern: if S3 is degraded for an extended period, the currentVersion counter in the DB continues incrementing while no corresponding version objects are written to S3. When S3 recovers, there will be gaps in the version history that are undetectable from the DB alone. Suggestion: Consider incrementing currentVersion only when the S3 write succeeds, or add a reconciliation mechanism for failed version writes. At minimum, consider emitting a structured metric or alert rather than a plain log so failed writes are observable in your monitoring stack. Minor Issues and Suggestions2. Commented-out user tracking code in updateChatflow Location: packages/server/src/services/chatflows/index.ts lines 425-429 The commented-out lines for editedByUserId, editedByName, and editedByEmail were already present before this PR but remain inside the new wrapped block. If this tracking is intentionally deferred, a TODO comment with a ticket reference would be more informative than dead commented code. If it is not planned, the lines should be removed. 3. rollbackToVersion signature change - typing opportunity Location: packages/server/src/services/chatflow-storage/index.ts line 306 The method signature change is correct - computing newVersion in the caller and passing it down ensures the S3 object version number matches what was committed to the DB. However, the user parameter retains any typing. Since the caller already has IUser from the service layer, the type could be tightened to user?: IUser. 4. Credential sync scope - text splitters not covered Location: packages/ui/src/views/docstore/LoaderConfigPreviewChunks.jsx line 108 The new credential sync block is in handleDocumentLoaderDataChange only. The handleTextSplitterDataChange function does not have equivalent credential sync logic. This is likely correct since text splitters typically do not use credentials, but worth confirming no text splitter nodes have credential inputs. Positive Observations
Checklist Assessment
Review conducted by Claude Code PR Review Agent |
…feb26 🔒 Security: Fix critical CVEs before Feb 26 deployment
PR Review: chore(release): staging to production - 2026.03.02PR: staging -> production (auto-generated release PR) Summary: This release PR contains four distinct change sets: (1) critical CVE dependency upgrades, (2) chatflow versioning bug fixes and S3 resilience improvements (reviewed in the Feb 26 pass), (3) new cross-workspace chatflow access for the sidekick, and (4) a credential sync fix in the document loader UI. The CVE updates and versioning fixes are sound. The cross-workspace access changes, which are new since the last review, are functionally correct but have notable security and typing concerns that should be addressed before merging to production. Critical Issues1. Security: Location: The updated access control flow works as follows:
The issue is step 1. Before this PR, A user in Organization A who is somehow assigned a workspaceId from Organization B (through data corruption or a future code path error) could access chatflows from Organization B. This pattern breaks the defense-in-depth principle: the database layer should be the first line of defense. Compare with Suggestion: Scope the initial 2. Security: Location: const hasWorkspaceAccess = chatflow.workspaceId
? assignedWorkspaces.some((ws: { id: string }) => ws.id === chatflow.workspaceId)
: falseIf a chatflow has a null or empty Verify whether any production chatflows have null Major Concerns3. Type safety: Location: const assignedWorkspaces = (req.user as any)?.assignedWorkspaces as Array<{ id: string }> | undefinedThe Suggestion: Update 4. Inconsistent access control patterns across the two changed controllers Location:
Minor Issues and Suggestions5. Empty array fallback obscures unauthenticated requests Location: const assignedWorkspaces =
(req.user as { assignedWorkspaces?: Array<{ id: string }> } | undefined)?.assignedWorkspaces || []When 6. Location: The 7. Commented-out user tracking code (carry-over from previous review) Location: The commented-out Positive Observations
Checklist Assessment
Review conducted by Claude Code PR Review Agent |
PR Review: chore(release): staging to production - 2026.03.02PR: #981 | Base: SummaryThis release PR bundles a batch of security-driven dependency upgrades (CVE patches for Next.js, axios, multer, tar-fs, form-data, playwright) with two functional changes: cross-workspace chatflow visibility for users with multiple assigned workspaces, and defensive try/catch wrapping around S3 versioning calls so that storage failures no longer block core chatflow operations. Overall the changes are well-scoped and the security intent is clear. There are a few points that warrant attention before merging to production. Critical Issues1. Location: // Before this PR (scoped query):
const chatflow = await chatflowService.getChatflowById(req.params.id, workspaceId)
// After this PR (unscoped query):
const chatflow = await chatflowService.getChatflowById(req.params.id)
The immediate risk is low because the post-fetch check does block unauthorized access, but this pattern violates the multi-tenancy convention: DB queries should be scoped as tightly as possible, and the existence of a record should not be revealed to a requester who has no access to it (even as a timing signal). The previous approach — passing Suggested approach: Pass the full list of 2. Location: if (workspaceIds && workspaceIds.length > 0) {
queryBuilder.andWhere('chat_flow.workspaceId IN (:...workspaceIds)', { workspaceIds })
} else if (workspaceId) {
queryBuilder.andWhere('chat_flow.workspaceId = :workspaceId', { workspaceId })
}The Major Concerns3. Next.js downgrade from 14.2.35 to 14.2.25 — the lock file notes 14.2.25 as a known vulnerable version Location: The lock file itself contains: next@14.2.25:
resolution: ...
deprecated: This version has a security vulnerability. Please upgrade to a patched version.
See https://nextjs.org/blog/security-update-2025-12-11 for more details.The PR description says this patches CVE-2025-29927, but the 4. axios pinned to 1.7.9 — significant downgrade from 1.12.x / 1.13.x Multiple packages had axios 5. Location: const hasWorkspaceAccess = chatflow.workspaceId
? assignedWorkspaces.some((ws: { id: string }) => ws.id === chatflow.workspaceId)
: falseIf Minor Issues and Suggestions6. Silent S3 failure swallows version consistency issues Location: The added 7. Location: const assignedWorkspaces = (req.user as any)?.assignedWorkspaces as Array<{ id: string }> | undefinedUsing 8. Version number increment logic moved to service from storage layer Location: The 9. Location: - }
+ },
+"packageManager":"pnpm@9.15.9"Minor: missing space after the colon ( Positive Observations
Checklist
Review conducted by Claude Code — focusing on security, multi-tenancy, and correctness. |
🚀 Release: Staging to Production
Release Date: 2026-03-02
Changes in this release
This PR is automatically created/updated when commits are pushed to staging.
Merging this PR will trigger the release workflow to create a new GitHub release.