4949 "extra" ,
5050 "attachments" ,
5151)
52+ REFERENCE_COVERED_SOURCES = (
53+ "chat_messages.content" ,
54+ "chat_messages.attachment_metadata" ,
55+ "documents.current_content.pdf_source_marker" ,
56+ "document_versions.content.pdf_source_marker" ,
57+ )
58+ REFERENCE_UNCOVERED_SOURCES = (
59+ "gallery_images.filename" ,
60+ "gallery_images.file_hash" ,
61+ "notes.image_url" ,
62+ "notes.color" ,
63+ "notes.content" ,
64+ "notes.items" ,
65+ "calendars.color" ,
66+ "calendar_events.color" ,
67+ "calendar_events.description" ,
68+ "calendar_events.location" ,
69+ )
70+ DURABLE_REFERENCE_SOURCES_INCOMPLETE = "durable_reference_sources_incomplete"
71+ INCOMPLETE_REFERENCE_SAMPLE_SCOPE = (
72+ "candidates_observed_within_incomplete_reference_scope"
73+ )
5274REFERENCE_CONTAINER_KEYS = {
5375 "attachment" ,
5476 "attachments" ,
@@ -96,7 +118,8 @@ def collect_storage_bloat_diagnostics(
96118 upload_report = _collect_upload_report (
97119 Path (upload_dir or UPLOAD_DIR ),
98120 live_upload_ids ,
99- db_report ["upload_references" ]["complete" ],
121+ db_report ["upload_references" ]["attempted_scan_complete" ],
122+ db_report ["upload_references" ]["reference_coverage" ]["complete" ],
100123 warnings ,
101124 )
102125 return {
@@ -201,6 +224,15 @@ def _connect_readonly(db_path: Path) -> sqlite3.Connection:
201224 return conn
202225
203226
227+ def _durable_reference_coverage_report () -> dict [str , Any ]:
228+ """Describe implemented reference scans without exposing persisted values."""
229+ return {
230+ "complete" : not REFERENCE_UNCOVERED_SOURCES ,
231+ "covered_sources" : list (REFERENCE_COVERED_SOURCES ),
232+ "uncovered_sources" : list (REFERENCE_UNCOVERED_SOURCES ),
233+ }
234+
235+
204236def _collect_db_report (
205237 db_path : Path | None ,
206238 warnings : list [str ],
@@ -221,7 +253,9 @@ def _collect_db_report(
221253 "scan_limit_scope" : "per_source" ,
222254 "value_char_scan_limit" : MAX_REFERENCE_CONTENT_CHARS ,
223255 "json_node_scan_limit" : MAX_REFERENCE_JSON_NODES ,
256+ "attempted_scan_complete" : False ,
224257 "complete" : False ,
258+ "reference_coverage" : _durable_reference_coverage_report (),
225259 },
226260 }
227261 live_upload_ids : set [str ] = set ()
@@ -491,7 +525,9 @@ def _live_upload_reference_report(
491525 "scan_limit_scope" : "per_source" ,
492526 "value_char_scan_limit" : MAX_REFERENCE_CONTENT_CHARS ,
493527 "json_node_scan_limit" : MAX_REFERENCE_JSON_NODES ,
528+ "attempted_scan_complete" : False ,
494529 "complete" : False ,
530+ "reference_coverage" : _durable_reference_coverage_report (),
495531 }
496532 live_ids : set [str ] = set ()
497533 scans_complete : list [bool ] = []
@@ -575,7 +611,11 @@ def _live_upload_reference_report(
575611 )
576612
577613 report ["live_reference_count" ] = len (live_ids )
578- report ["complete" ] = bool (scans_complete ) and all (scans_complete )
614+ attempted_scan_complete = bool (scans_complete ) and all (scans_complete )
615+ report ["attempted_scan_complete" ] = attempted_scan_complete
616+ report ["complete" ] = (
617+ attempted_scan_complete and report ["reference_coverage" ]["complete" ]
618+ )
579619 return report , live_ids
580620
581621
@@ -788,6 +828,7 @@ def _collect_upload_report(
788828 upload_dir : Path ,
789829 live_upload_ids : set [str ],
790830 reference_scan_complete : bool ,
831+ durable_reference_coverage_complete : bool ,
791832 warnings : list [str ],
792833) -> dict [str , Any ]:
793834 report : dict [str , Any ] = {
@@ -813,6 +854,9 @@ def _collect_upload_report(
813854 observed_count = 0 ,
814855 sample = [],
815856 reference_scan_complete = reference_scan_complete ,
857+ durable_reference_coverage_complete = (
858+ durable_reference_coverage_complete
859+ ),
816860 upload_traversal_complete = False ,
817861 ),
818862 }
@@ -831,6 +875,7 @@ def _collect_upload_report(
831875 manifest_ids ,
832876 live_upload_ids ,
833877 reference_scan_complete ,
878+ durable_reference_coverage_complete ,
834879 warnings ,
835880 )
836881 report .update (file_report )
@@ -845,6 +890,7 @@ def _upload_file_report(
845890 manifest_ids : set [str ],
846891 live_upload_ids : set [str ],
847892 reference_scan_complete : bool ,
893+ durable_reference_coverage_complete : bool ,
848894 warnings : list [str ],
849895) -> dict [str , Any ]:
850896 state = UploadTraversalState (visited_dirs = 1 )
@@ -861,7 +907,7 @@ def _upload_file_report(
861907 orphan_count += 1
862908 if len (orphan_sample ) < MAX_ORPHAN_ROWS :
863909 orphan_sample .append (
864- _upload_sample (record , upload_dir , manifest_ids , live_upload_ids )
910+ _upload_sample (record , upload_dir , manifest_ids )
865911 )
866912
867913 traversal_unreadable = state .skipped_unreadable_count > 0
@@ -884,6 +930,9 @@ def _upload_file_report(
884930 observed_count = orphan_count ,
885931 sample = orphan_sample ,
886932 reference_scan_complete = reference_scan_complete ,
933+ durable_reference_coverage_complete = (
934+ durable_reference_coverage_complete
935+ ),
887936 upload_traversal_complete = not traversal_incomplete ,
888937 upload_traversal_truncated = state .truncated ,
889938 upload_traversal_unreadable = traversal_unreadable ,
@@ -896,13 +945,16 @@ def _suspected_orphan_report(
896945 observed_count : int ,
897946 sample : list [dict [str , Any ]],
898947 reference_scan_complete : bool ,
948+ durable_reference_coverage_complete : bool ,
899949 upload_traversal_complete : bool ,
900950 upload_traversal_truncated : bool = False ,
901951 upload_traversal_unreadable : bool = False ,
902952) -> dict [str , Any ]:
903953 reasons : list [str ] = []
904954 if not reference_scan_complete :
905955 reasons .append ("db_reference_scan_incomplete" )
956+ if not durable_reference_coverage_complete :
957+ reasons .append (DURABLE_REFERENCE_SOURCES_INCOMPLETE )
906958 if upload_traversal_truncated or (
907959 not upload_traversal_complete and not upload_traversal_unreadable
908960 ):
@@ -917,6 +969,11 @@ def _suspected_orphan_report(
917969 "count" : observed_count if complete else None ,
918970 "observed_count" : observed_count ,
919971 "reason_incomplete" : reasons or None ,
972+ "sample_scope" : (
973+ "suspected_orphan_candidates"
974+ if complete
975+ else INCOMPLETE_REFERENCE_SAMPLE_SCOPE
976+ ),
920977 "sample" : sample ,
921978 }
922979
@@ -1024,14 +1081,12 @@ def _upload_sample(
10241081 record : UploadFileRecord ,
10251082 upload_dir : Path ,
10261083 manifest_ids : set [str ],
1027- live_upload_ids : set [str ],
10281084) -> dict [str , Any ]:
10291085 return {
10301086 "path_hash" : _hash_upload_identifier (_relative_upload_path (upload_dir , record .path )),
10311087 "relative_dir_bucket" : _safe_relative_dir_bucket (upload_dir , record .path ),
10321088 "size_bytes" : record .size_bytes ,
10331089 "manifest_present" : _upload_file_in_manifest (record .path , manifest_ids ),
1034- "live_db_reference_found" : _upload_file_is_live (record .path , live_upload_ids ),
10351090 }
10361091
10371092
0 commit comments