Segment-Drag Regression: Pull the Session, Gate the Fix
conversationA senior frontend engineer at SpeechLab gets an alert that the segment-drag bug — which was fixed three sprints ago — is back on the production translate-ui-react app. She uses Claude Code with the CUIT MCP server to find the matching session, generate a Playwright regression spec from it, run it against the broken build to confirm RED, then ship the fix and spec in a single PR.
Persona: Senior frontend engineer at SpeechLab, primary owner of translate-ui-react, has CUIT MCP wired into her Claude Code config, comfortable with the recorder/spec-gen loop but prefers staying in the editor rather than switching to a dashboard.
cuit__query_sessions{
"sessions": [
{
"id": "a3f8c2d1-4e7b-4a90-b3c5-f1e2d9087a44",
"created_at": "2026-05-22T14:31:08Z",
"source": "jam",
"reporter": "alex@speechlab.ai",
"component": "WaveformEditor",
"interaction_summary": "segment drag — drop accepted, segment position reverts to origin on next render",
"outcome": "bug",
"spec_id": null,
"tags": ["drag", "segment", "revert", "sprint-14"]
},
{
"id": "b91d7e40-0c3a-4f62-8a17-2c4056f3d889",
"created_at": "2026-06-09T09:14:52Z",
"source": "jam",
"reporter": "priya@speechlab.ai",
"component": "WaveformEditor",
"interaction_summary": "segment drag — segment snaps back after drop, no position update in store",
"outcome": "bug",
"spec_id": null,
"tags": ["drag", "segment", "revert"]
},
{
"id": "c44a12f7-9b8e-41dc-b0f2-7d3e91c6a021",
"created_at": "2026-06-08T16:55:30Z",
"source": "recorder-extension",
"reporter": "dana@speechlab.ai",
"component": "TranscriptPanel",
"interaction_summary": "speaker label edit, focus trap on save button",
"outcome": "bug",
"spec_id": null,
"tags": ["focus", "transcript"]
}
],
"total": 47,
"limit": 50
}cuit__find_similar_sessions{
"reference_session_id": "a3f8c2d1-4e7b-4a90-b3c5-f1e2d9087a44",
"threshold": 0.85,
"matches": [
{
"session_id": "b91d7e40-0c3a-4f62-8a17-2c4056f3d889",
"similarity": 0.97,
"created_at": "2026-06-09T09:14:52Z",
"reporter": "priya@speechlab.ai",
"interaction_summary": "segment drag — segment snaps back after drop, no position update in store",
"component": "WaveformEditor",
"outcome": "bug",
"event_count": 14,
"events_preview": [
{ "type": "pointerdown", "target": "[data-cuit=segment-handle]", "t": 0 },
{ "type": "pointermove", "target": "[data-cuit=segment-handle]", "t": 312, "dx": 148 },
{ "type": "pointerup", "target": "[data-cuit=waveform-drop-zone]", "t": 891 },
{ "type": "state-snapshot", "key": "segments[2].startMs", "expected": 4820, "actual": 3200, "t": 920 }
]
},
{
"session_id": "d02b8af3-5531-4c78-9e60-1a8b34d07c55",
"similarity": 0.88,
"created_at": "2026-06-09T09:41:17Z",
"reporter": "automated-sentry-bridge",
"interaction_summary": "segment drag abort — pointerup outside drop zone, segment returns correctly",
"component": "WaveformEditor",
"outcome": "expected",
"event_count": 11,
"events_preview": []
}
],
"match_count": 2
}cuit__generate_spec_from_session{
"session_id": "b91d7e40-0c3a-4f62-8a17-2c4056f3d889",
"spec_id": "spec-7f3a29c0-e841-4d1b-b6c2-09d4f8ea3301",
"file": "tests/regressions/waveform-segment-drag.spec.ts",
"generated_at": "2026-06-09T09:53:04Z",
"model_passes": [
{ "pass": 1, "role": "event-normalizer", "tokens_in": 1840, "tokens_out": 620, "cache_hit": true },
{ "pass": 2, "role": "primitive-selector", "tokens_in": 3210, "tokens_out": 980, "cache_hit": true },
{ "pass": 3, "role": "assertion-synthesizer","tokens_in": 2760, "tokens_out": 1240, "cache_hit": false }
],
"spec_preview": "import { test, expect } from '@playwright/test';\nimport { dragSegment, getSegmentState } from '@cuit/harness';\n\ntest('segment drag updates startMs in store after drop', async ({ page }) => {\n await page.goto(process.env.TARGET_URL!);\n const before = await getSegmentState(page, 2);\n await dragSegment(page, { segmentIndex: 2, deltaMs: 1620 });\n const after = await getSegmentState(page, 2);\n expect(after.startMs).toBe(before.startMs + 1620);\n});",
"ast_valid": true,
"primitive_calls": ["dragSegment", "getSegmentState"],
"cost_usd": 0.38
}cuit__run_spec{
"spec_id": "spec-7f3a29c0-e841-4d1b-b6c2-09d4f8ea3301",
"target_url": "https://translate-ui-react.speechlab.app",
"run_id": "run-4c91b3d7-2a05-4e88-a7f0-dc18f60e2295",
"status": "failed",
"duration_ms": 4812,
"result": {
"passed": 0,
"failed": 1,
"skipped": 0
},
"failure": {
"test": "segment drag updates startMs in store after drop",
"assertion": "expect(after.startMs).toBe(before.startMs + 1620)",
"expected": 4820,
"received": 3200,
"diff": -1620,
"location": "tests/regressions/waveform-segment-drag.spec.ts:7"
},
"trace_url": "https://cuit.speechlab.ai/runs/run-4c91b3d7"
}cuit__run_spec{
"spec_id": "spec-7f3a29c0-e841-4d1b-b6c2-09d4f8ea3301",
"target_url": "http://localhost:3000",
"run_id": "run-9e27d1a0-0b4c-4f13-b5e8-cc03a7f14d80",
"status": "passed",
"duration_ms": 3940,
"result": {
"passed": 1,
"failed": 0,
"skipped": 0
},
"failure": null,
"trace_url": "https://cuit.speechlab.ai/runs/run-9e27d1a0"
}cuit__regression_test_for_pr{
"pr_url": "https://github.com/speechlab/translate-ui-react/pull/1847",
"pr_number": 1847,
"title": "fix(waveform): restore startMs update in DRAG_COMMIT reducer + regression spec",
"base": "main",
"head": "fix/segment-drag-startms",
"labels": ["regression", "bug"],
"body_excerpt": "## What\n- Restores `startMs` recalculation in `useSegmentDragReducer` DRAG_COMMIT case lost in the clock-offset refactor (#1831).\n- Adds CUIT regression spec generated from session b91d7e40.\n\n## CUIT evidence\n| Run | Result | Link |\n|-----|--------|------|\n| Prod (broken build) | RED | https://cuit.speechlab.ai/runs/run-4c91b3d7 |\n| Local (fix branch) | GREEN | https://cuit.speechlab.ai/runs/run-9e27d1a0 |\n\nSession: https://cuit.speechlab.ai/sessions/b91d7e40\n\n## Regression gate\n`tests/regressions/waveform-segment-drag.spec.ts` is now a permanent CI check. This bug cannot reopen without failing the gate before merge.",
"status": "open"
}