@@ -203,6 +203,9 @@ def perform_consistency_check(app, env):
203203 for each item ID that matches it and is not defined as a checklist-item.
204204 """
205205 env .traceability_collection .process_intermediate_nodes ()
206+ # Restore implicit reverse relations on every consistency check to handle incremental builds
207+ if hasattr (env , 'traceability_collection' ):
208+ env .traceability_collection .rebuild_implicit_relations ()
206209 ItemRelink .remove_placeholders (env .traceability_collection )
207210 try :
208211 env .traceability_collection .self_test (app .config .traceability_notifications .get ('undefined-reference' ))
@@ -315,8 +318,10 @@ def init_available_relationships(app):
315318def initialize_environment (app ):
316319 """Perform initializations needed before the build process starts."""
317320 env = app .builder .env
318-
319- env .traceability_ref_nodes = {}
321+ # Preserve cached environment data across incremental builds
322+ # Only initialize when missing to avoid losing items/refs from unchanged docs
323+ if not hasattr (env , 'traceability_ref_nodes' ) or env .traceability_ref_nodes is None :
324+ env .traceability_ref_nodes = {}
320325 processed_sort_config = {}
321326 for attr , sort_spec in app .config .traceability_attributes_sort .items ():
322327 try :
@@ -325,12 +330,22 @@ def initialize_environment(app):
325330 report_warning (f"Invalid sort configuration for attribute '{ attr } ': { str (e )} " )
326331 # Fall back to default sorting
327332 processed_sort_config [attr ] = sorted
328- env .traceability_collection = TraceableCollection ()
333+ if not hasattr (env , 'traceability_collection' ) or env .traceability_collection is None :
334+ env .traceability_collection = TraceableCollection ()
335+ # Always update sort config on the existing collection
329336 env .traceability_collection .attributes_sort = processed_sort_config
330- # Copy configuration dictionaries to environment to avoid modifying app.config
331- env .traceability_checklist = dict (app .config .traceability_checklist )
332- env .traceability_attributes = dict (app .config .traceability_attributes )
333- env .traceability_attribute_to_string = dict (app .config .traceability_attribute_to_string )
337+ # Copy configuration dictionaries to environment to avoid modifying app.config,
338+ # but preserve any cached data (e.g., checklist query_results) on incremental builds
339+ if not hasattr (env , 'traceability_checklist' ) or env .traceability_checklist is None :
340+ env .traceability_checklist = dict (app .config .traceability_checklist )
341+ else :
342+ # Update values from config without dropping existing runtime keys
343+ for k , v in app .config .traceability_checklist .items ():
344+ env .traceability_checklist .setdefault (k , v )
345+ if not hasattr (env , 'traceability_attributes' ) or env .traceability_attributes is None :
346+ env .traceability_attributes = dict (app .config .traceability_attributes )
347+ if not hasattr (env , 'traceability_attribute_to_string' ) or env .traceability_attribute_to_string is None :
348+ env .traceability_attribute_to_string = dict (app .config .traceability_attribute_to_string )
334349
335350 all_relationships = set (app .config .traceability_relationships ).union (app .config .traceability_relationships .values ())
336351 all_relationships .discard ('' )
@@ -356,6 +371,17 @@ def initialize_environment(app):
356371 )
357372
358373
374+ def _purge (app , env , docname ):
375+ """Ensure we purge items and relations when a document is updated in incremental builds."""
376+ if hasattr (env , 'traceability_collection' ):
377+ env .traceability_collection .remove_items_from_document (docname )
378+ # Purge attribute descriptions defined in this document to avoid stale captions/content
379+ to_delete = [attr_id for attr_id , attr in TraceableItem .defined_attributes .items ()
380+ if getattr (attr , 'docname' , None ) == docname ]
381+ for attr_id in to_delete :
382+ del TraceableItem .defined_attributes [attr_id ]
383+
384+
359385# ----------------------------------------------------------------------------
360386# Event handler helper functions
361387def add_checklist_attribute (checklist_config , attributes_config , attribute_to_string_config ):
@@ -702,6 +728,7 @@ def copy_html_assets(app, exception):
702728 app .add_directive ('attribute-sort' , AttributeSortDirective )
703729
704730 app .connect ('builder-inited' , initialize_environment )
731+ app .connect ('env-purge-doc' , _purge )
705732 app .connect ('env-check-consistency' , perform_consistency_check )
706733 app .connect ('doctree-resolved' , process_item_nodes )
707734
0 commit comments