@@ -121,7 +121,7 @@ describe('cleanup soft deletes', () => {
121121 key : 'workspace/ws-1/file-failed' ,
122122 workspaceId : 'ws-1' ,
123123 context : 'workspace' ,
124- size : 11 ,
124+ sizeBytes : 11 ,
125125 } ,
126126 ] )
127127 mockDeleteFiles . mockResolvedValueOnce ( {
@@ -148,14 +148,14 @@ describe('cleanup soft deletes', () => {
148148 key : 'workspace/ws-1/file-deleted' ,
149149 workspaceId : 'ws-1' ,
150150 context : 'workspace' ,
151- size : 7 ,
151+ sizeBytes : 7 ,
152152 } ,
153153 {
154154 id : 'file-restored' ,
155155 key : 'workspace/ws-1/file-restored' ,
156156 workspaceId : 'ws-1' ,
157157 context : 'workspace' ,
158- size : 13 ,
158+ sizeBytes : 13 ,
159159 } ,
160160 ] )
161161 mockDeleteFiles . mockResolvedValueOnce ( { deleted : 2 , failed : [ ] } )
@@ -184,7 +184,7 @@ describe('cleanup soft deletes', () => {
184184 key : 'mothership/chat-file' ,
185185 workspaceId : 'ws-1' ,
186186 context : 'mothership' ,
187- size : 17 ,
187+ sizeBytes : 17 ,
188188 } ,
189189 ] )
190190 mockDeleteFiles . mockResolvedValueOnce ( { deleted : 1 , failed : [ ] } )
@@ -198,6 +198,26 @@ describe('cleanup soft deletes', () => {
198198 expect ( mockDecrementStorageUsageForBillingContextInTx ) . not . toHaveBeenCalled ( )
199199 } )
200200
201+ it ( 'fails before deleting storage when canonical size metadata is missing' , async ( ) => {
202+ mockSelectRowsByIdChunks
203+ . mockResolvedValueOnce ( [ ] )
204+ . mockResolvedValueOnce ( [ ] )
205+ . mockResolvedValueOnce ( [
206+ {
207+ id : 'file-missing-size' ,
208+ key : 'workspace/ws-1/file-missing-size' ,
209+ workspaceId : 'ws-1' ,
210+ context : 'workspace' ,
211+ sizeBytes : null ,
212+ } ,
213+ ] )
214+
215+ await expect ( runCleanupSoftDeletes ( basePayload ) ) . rejects . toThrow (
216+ 'Workspace file is missing canonical size_bytes metadata'
217+ )
218+ expect ( mockDeleteFiles ) . not . toHaveBeenCalled ( )
219+ } )
220+
201221 it ( 'hard-deletes retained documents before deleting an expired knowledge base' , async ( ) => {
202222 mockChunkedBatchDelete . mockImplementationOnce (
203223 async ( options : {
0 commit comments