Config-Sync Cross-Preset Contamination

Describe the bug
Sync overwrote a recently configured floating menu - I details in “Syncing static parent config, excluding dynamic child items” post. This is more details from AI about how the sync failed, to be a general sync-bug report.


Affected input device (e.g. MacBook Trackpad, Magic Mouse/Trackpad, Touch Bar, etc.):slight_smile:macbook mouse & menu


Device information:

  • Type of Mac:MacBook Pro 14” 2023

  • macOS version: 26.4.1

  • BetterTouchTool version: 6.396


Additional information: AI-generated report

Bug Report: Cross-Preset Contamination — Synced Preset Overwrites Local Preset Triggers

Category: Unexpected Behavior
Reproducibility: Occurred after BTT update/restart with sync enabled


Summary

After BTT update + restart, triggers in a local (non-synced) preset were severely corrupted by data from the "Synced" preset. The corruption manifested as:

  1. Empty "zombie" actions from the Synced preset injected into local preset triggers
  2. Complete deletion of a complex floating menu trigger
  3. Config property gutting — a floating menu lost 32 of 39 config properties

The root cause appears to be a cross-preset boundary violation during sync/restart: the Synced preset's data overwrote or deleted data belonging to a completely separate local preset (sequoia_status_item_bar).


Evidence

1. Zombie Action Shells (5 instances)

Five triggers in the sequoia_status_item_bar preset had empty action shells injected into them. Each zombie action had:

  • BTTTriggerBelongsToPreset: "Synced" ← wrong preset
  • No BTTPredefinedActionType (the field that defines what the action does)
  • No meaningful configuration — just a UUID and preset tag

These actions were children of triggers that belonged to sequoia_status_item_bar, creating an impossible state: a parent trigger in preset A containing child actions tagged as belonging to preset B.

Affected triggers:

Trigger Trigger Preset Zombie Action UUID Action's Preset Tag
Battery status item sequoia_status_item_bar (removed) Synced
BetterSnapTool status item sequoia_status_item_bar (removed) Synced
BTT icon status item sequoia_status_item_bar 4CBD98D2-... Synced
Unnamed status item #1 sequoia_status_item_bar (removed) Synced
Unnamed status item #2 sequoia_status_item_bar (removed) Synced

The zombie on the BTT icon status item was directly responsible for the StatusItemBar failing to open — it was the first action in the action list, and since it had no BTTPredefinedActionType, it effectively became a no-op that blocked execution.

2. Complete Trigger Deletion — HoverRecognitionOverlay

The HoverRecognitionOverlay floating menu (UUID: B7C825A4) was completely deleted from the config. This was a complex trigger with:

  • 42 config properties defining an invisible hover detection overlay
  • 3 child items (hover-start action → Show StatusItemBar, dummy hit area, hover-end action → Hide StatusItemBar)
  • Careful positioning at top-right of the focused screen

After the restart, it simply didn't exist. No trace in any preset. It had to be fully recreated from a backup preset file.

3. Config Property Gutting — StatusItemBar

The StatusItemBar floating menu (UUID: 356DDAB3) retained its basic existence but lost most of its configuration:

Before (from backup) After corruption
BTTMenuConfig properties 39 ~7
Positioning config Full (relative to screen, anchored center-right) Missing
Visual config Blur, padding, spacing, corner radius, colors Missing
Behavior config Hover animations, visibility, window level Missing
BTTMenuVisibility 1 (hidden by default, shown via action) Missing (defaults to 0 = always visible)
BTTMenuElementIdentifier "StatusItemBar" Missing

The menu still existed as a trigger, but with its config stripped it couldn't function — it had no positioning, no visibility control, and no element identifier for Show/Hide actions to reference.

4. Additional Zombie Items in StatusItemBar

Post-recovery inspection found 2 additional zombie child items inside the StatusItemBar (UUIDs: 8F07173B, B061F84F) that:

  • Have no BTTTriggerType set
  • Have names equal to their own UUIDs (auto-generated placeholder names)
  • Have minimal config (only BTTMenuElementIdentifier set to their own UUID)
  • Were not present in the original backup preset

These are likely additional artifacts of the cross-preset sync contamination.


The Anti-Pattern

The core issue is a preset boundary violation. BTT's preset system implies isolation — triggers in preset A should not be affected by sync operations on preset B. But the observed behavior shows:

Synced preset sync/load
  → Reaches into sequoia_status_item_bar preset
    → Injects empty action shells with "Synced" preset tag
    → Deletes HoverRecognitionOverlay entirely
    → Strips StatusItemBar config to minimal skeleton
    → Inserts unnamed zombie child items

This suggests the sync mechanism may be matching/merging triggers by UUID or some other identifier across preset boundaries, rather than operating strictly within the Synced preset's scope.


Steps to Reproduce (Suspected)

  1. Have two presets: one synced ("Synced"), one local ("sequoia_status_item_bar")
  2. Both presets contain Global floating menu triggers
  3. Trigger BTT sync (e.g., by updating BTT, which causes a restart)
  4. After restart, inspect the local preset's triggers

Note: I haven't confirmed whether the triggers share any identifiers across presets that could cause UUID-based merging. The corruption might be triggered by overlapping BTTMenuElementIdentifier values or by the sync mechanism's trigger-matching logic.


Impact

  • Functional breakage: The StatusItemBar floating menu stopped appearing entirely (the primary hover trigger was deleted, and the zombie action blocked the fallback)
  • Data loss: 32 config properties lost from StatusItemBar, entire HoverRecognitionOverlay trigger tree deleted
  • Silent corruption: No error messages, no UI indication that anything went wrong. The user only notices when functionality breaks.
  • Recovery difficulty: Required a backup preset file and manual JSON-level restoration. Without the backup, the full config would have been unrecoverable.

Fix Applied (Manual)

  1. Removed all 5 zombie action shells via manage_trigger_actions (operation: remove)
  2. Restored StatusItemBar's full 39-property BTTMenuConfig via update_btt_trigger
  3. Recreated HoverRecognitionOverlay from backup preset via create_new_btt_trigger_from_json
  4. Fixed HoverRecognitionOverlay's preset assignment (it defaulted to "Synced" on creation; updated to "sequoia_status_item_bar")
  5. Removed 2 additional zombie child items from StatusItemBar

Suggested Fix

The sync mechanism should enforce strict preset boundaries:

  • When loading/applying the Synced preset, only modify triggers where BTTTriggerBelongsToPreset == "Synced"
  • Never inject actions into triggers belonging to other presets
  • Never delete or modify triggers belonging to other presets
  • If UUID conflicts exist across presets, handle them by skipping (not merging)

Additionally, a sync integrity check on startup could detect cross-preset contamination (actions whose BTTTriggerBelongsToPreset doesn't match their parent trigger's preset) and flag or auto-repair it.


Environment

  • BTT 6.x (latest stable as of April 2026)
  • Two Macs syncing via BTT's built-in sync
  • Presets: "Synced" (synced) + "sequoia_status_item_bar" (local, not synced)

oh my god please stop the ai generated posts, they are so long, impossible to read and contain so much incorrect (guessed) stuff. I‘m closing all of them as they make me sick just looking over them.