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.)
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:
- Empty "zombie" actions from the Synced preset injected into local preset triggers
- Complete deletion of a complex floating menu trigger
- 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
BTTTriggerTypeset - Have names equal to their own UUIDs (auto-generated placeholder names)
- Have minimal config (only
BTTMenuElementIdentifierset 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)
- Have two presets: one synced ("Synced"), one local ("sequoia_status_item_bar")
- Both presets contain Global floating menu triggers
- Trigger BTT sync (e.g., by updating BTT, which causes a restart)
- 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)
- Removed all 5 zombie action shells via
manage_trigger_actions(operation: remove) - Restored StatusItemBar's full 39-property
BTTMenuConfigviaupdate_btt_trigger - Recreated HoverRecognitionOverlay from backup preset via
create_new_btt_trigger_from_json - Fixed HoverRecognitionOverlay's preset assignment (it defaulted to "Synced" on creation; updated to "sequoia_status_item_bar")
- 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)