Skip to content

Commit ba2fdbe

Browse files
committed
feat(cli): correlate feedback submissions
1 parent 16ab8b2 commit ba2fdbe

3 files changed

Lines changed: 31 additions & 3 deletions

File tree

packages/cli/src/commands/feedback.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,12 @@ export default defineCommand({
162162

163163
// The standalone command runs separately from `render`, so it has no real
164164
// elapsed time to report. Omit it rather than recording a fake duration.
165-
trackRenderFeedback({ rating, comment, doctorSummary });
165+
const feedbackId = trackRenderFeedback({ rating, comment, doctorSummary });
166166

167167
await flush();
168168
// Ack first so the user isn't kept waiting on the best-effort forward (which
169169
// is bounded to a few seconds and never surfaces an error either way).
170-
console.log(c.dim("Thanks for the feedback!"));
170+
console.log(c.dim(`Thanks for the feedback! (Feedback ID: ${feedbackId})`));
171171
await submitFeedback({ rating, comment, cliVersion: VERSION, env: doctorSummary });
172172

173173
if (args["file-issue"] === true) {

packages/cli/src/telemetry/events.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,30 @@ describe("trackRenderFeedback", () => {
140140
expect.objectContaining({ render_duration_ms: 6000 }),
141141
);
142142
});
143+
144+
it("uses an injected feedback id for deterministic correlation", () => {
145+
expect(trackRenderFeedback({ rating: 5, feedbackId: "feedback-test-123" })).toBe(
146+
"feedback-test-123",
147+
);
148+
149+
expect(trackEvent).toHaveBeenCalledWith(
150+
"survey sent",
151+
expect.objectContaining({ feedback_id: "feedback-test-123" }),
152+
);
153+
});
154+
155+
it("generates a submission-scoped UUID when no id is injected", () => {
156+
vi.spyOn(crypto, "randomUUID").mockReturnValue(
157+
"generated-feedback-id" as `${string}-${string}-${string}-${string}-${string}`,
158+
);
159+
160+
expect(trackRenderFeedback({ rating: 4 })).toBe("generated-feedback-id");
161+
162+
expect(trackEvent).toHaveBeenCalledWith(
163+
"survey sent",
164+
expect.objectContaining({ feedback_id: "generated-feedback-id" }),
165+
);
166+
});
143167
});
144168

145169
describe("trackCliError", () => {

packages/cli/src/telemetry/events.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,14 +529,18 @@ export function trackRenderFeedback(props: {
529529
renderDurationMs?: number;
530530
comment?: string;
531531
doctorSummary?: string;
532-
}): void {
532+
feedbackId?: string;
533+
}): string {
534+
const feedbackId = props.feedbackId ?? globalThis.crypto.randomUUID();
533535
trackEvent("survey sent", {
534536
$survey_id: "render_satisfaction",
535537
$survey_response: props.rating,
538+
feedback_id: feedbackId,
536539
...(props.comment ? { $survey_response_2: props.comment } : {}),
537540
...(props.renderDurationMs !== undefined ? { render_duration_ms: props.renderDurationMs } : {}),
538541
...(props.doctorSummary ? { doctor_summary: props.doctorSummary } : {}),
539542
});
543+
return feedbackId;
540544
}
541545

542546
export function trackCommandResult(props: {

0 commit comments

Comments
 (0)