diff --git a/src/renderer/src/components/settings/HiddenExperimentalGroup.test.tsx b/src/renderer/src/components/settings/HiddenExperimentalGroup.test.tsx
new file mode 100644
index 00000000000..18109fbdb52
--- /dev/null
+++ b/src/renderer/src/components/settings/HiddenExperimentalGroup.test.tsx
@@ -0,0 +1,46 @@
+// @vitest-environment happy-dom
+
+import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
+import { cleanup, fireEvent, render, screen } from '@testing-library/react'
+import { HiddenExperimentalGroup } from './HiddenExperimentalGroup'
+
+const isArmed = vi.fn()
+const setArmed = vi.fn()
+vi.mock('../terminal-pane/terminal-render-desync-trigger', () => ({
+ isTerminalRenderDesyncSentinelArmed: (...args: unknown[]) => isArmed(...args),
+ setTerminalRenderDesyncSentinelArmed: (...args: unknown[]) => setArmed(...args)
+}))
+
+describe('HiddenExperimentalGroup', () => {
+ beforeEach(() => {
+ vi.clearAllMocks()
+ isArmed.mockReturnValue(false)
+ })
+ afterEach(() => {
+ cleanup()
+ })
+
+ function renderDiagnosticsSwitch(): HTMLElement {
+ return screen.getByRole('switch', { name: 'Terminal render diagnostics' })
+ }
+
+ it('initializes the render-diagnostics switch from the armed state', () => {
+ isArmed.mockReturnValue(true)
+ render()
+
+ expect(renderDiagnosticsSwitch().getAttribute('data-state')).toBe('checked')
+ })
+
+ it('arms and disarms the capture sentinel through the switch', () => {
+ render()
+ expect(renderDiagnosticsSwitch().getAttribute('data-state')).toBe('unchecked')
+
+ fireEvent.click(renderDiagnosticsSwitch())
+ expect(setArmed).toHaveBeenCalledWith(true)
+ expect(renderDiagnosticsSwitch().getAttribute('data-state')).toBe('checked')
+
+ fireEvent.click(renderDiagnosticsSwitch())
+ expect(setArmed).toHaveBeenCalledWith(false)
+ expect(renderDiagnosticsSwitch().getAttribute('data-state')).toBe('unchecked')
+ })
+})
diff --git a/src/renderer/src/components/settings/HiddenExperimentalGroup.tsx b/src/renderer/src/components/settings/HiddenExperimentalGroup.tsx
index 25541870376..8ab946d186b 100644
--- a/src/renderer/src/components/settings/HiddenExperimentalGroup.tsx
+++ b/src/renderer/src/components/settings/HiddenExperimentalGroup.tsx
@@ -1,5 +1,10 @@
+import { useState } from 'react'
import { Label } from '../ui/label'
import { Switch } from '../ui/switch'
+import {
+ isTerminalRenderDesyncSentinelArmed,
+ setTerminalRenderDesyncSentinelArmed
+} from '../terminal-pane/terminal-render-desync-trigger'
import { translate } from '@/i18n/i18n'
// Why: anything in this group is deliberately unfinished or staff-only. The
@@ -7,6 +12,13 @@ import { translate } from '@/i18n/i18n'
// for hidden-experimental items so future entries inherit the same
// affordance without another round of styling decisions.
export function HiddenExperimentalGroup(): React.JSX.Element {
+ const [renderDiagnosticsArmed, setRenderDiagnosticsArmed] = useState(
+ isTerminalRenderDesyncSentinelArmed
+ )
+ const onRenderDiagnosticsChange = (armed: boolean): void => {
+ setTerminalRenderDesyncSentinelArmed(armed)
+ setRenderDiagnosticsArmed(armed)
+ }
return (
@@ -28,25 +40,25 @@ export function HiddenExperimentalGroup(): React.JSX.Element {
{translate(
- 'auto.components.settings.HiddenExperimentalGroup.1014ddbfaf',
- 'Does nothing today. Reserved as the first slot for hidden experimental options.'
+ 'auto.components.settings.HiddenExperimentalGroup.7c4e18d2f6',
+ 'Arms the bold-glitch capture gestures on this machine: Cmd/Ctrl-click a terminal starts a sampling burst; add Shift to capture pane evidence to disk.'
)}