@@ -40,6 +40,7 @@ export function generateCheckSummary(checkId: string, report: any): CheckSummary
4040 case 'D001' : return summarizeD001 ( nodeData ) ;
4141 case 'D004' : return summarizeD004 ( nodeData ) ;
4242 case 'F001' : return summarizeF001 ( nodeData ) ;
43+ case 'F003' : return summarizeF003 ( nodeData ) ;
4344 case 'G001' : return summarizeG001 ( nodeData ) ;
4445 case 'G003' : return summarizeG003 ( nodeData ) ;
4546 default :
@@ -243,6 +244,35 @@ function summarizeF001(nodeData: any): CheckSummary {
243244 } ;
244245}
245246
247+ function summarizeF003 ( nodeData : any ) : CheckSummary {
248+ const data = nodeData ?. data || { } ;
249+ let flaggedCount = 0 ;
250+ let disabledCount = 0 ;
251+
252+ // Aggregate across all databases. Only non-tiny disabled-autovacuum tables
253+ // (autovacuum_disabled_flagged_count) trigger a warning - tiny tables with
254+ // autovacuum off are common and not worth alerting on.
255+ for ( const dbData of Object . values ( data ) ) {
256+ const dbEntry = dbData as any ;
257+ flaggedCount += dbEntry . flagged_count || 0 ;
258+ disabledCount += dbEntry . autovacuum_disabled_flagged_count || 0 ;
259+ }
260+
261+ if ( flaggedCount === 0 && disabledCount === 0 ) {
262+ return { status : 'ok' , message : 'No significant dead tuple accumulation' } ;
263+ }
264+
265+ const parts : string [ ] = [ ] ;
266+ if ( flaggedCount > 0 ) {
267+ parts . push ( `${ flaggedCount } table${ flaggedCount > 1 ? 's' : '' } with excessive dead tuples` ) ;
268+ }
269+ if ( disabledCount > 0 ) {
270+ parts . push ( `${ disabledCount } table${ disabledCount > 1 ? 's' : '' } with autovacuum disabled` ) ;
271+ }
272+
273+ return { status : 'warning' , message : parts . join ( ', ' ) } ;
274+ }
275+
246276function summarizeG001 ( nodeData : any ) : CheckSummary {
247277 const data = nodeData ?. data || { } ;
248278 const settingsCount = Object . keys ( data ) . length ;
0 commit comments