feat: post-render and Studio feedback collection via PostHog surveys (#1101)

* feat(cli): prompt for render satisfaction after successful renders

* feat: add text feedback, doctor context, and Studio render feedback UI

* feat(studio): replace render feedback with session-based Studio experience bar

Move the feedback prompt out of RenderQueueItem (where it triggered every
5th render) into a standalone StudioFeedbackBar mounted at the bottom of
the preview area. The new bar is session-gated (shows after the 5th studio
session), auto-dismisses after 20s, and respects a 30-day cooldown once
dismissed or submitted. Renames telemetry to trackStudioFeedback with a
"studio_experience" survey ID to reflect the broader scope.

* feat(studio): attach browser doctor summary to feedback events

* fix(studio): use recurring interval for feedback instead of one-time cooldown

* fix(cli): skip feedback prompt when an agent runtime is detected

* feat(cli): add hyperframes feedback command and agent render hint

- New `hyperframes feedback --rating <1-5> --comment "..."` command
  for submitting anonymous render satisfaction feedback via telemetry.
- When an AI agent runtime is detected after a render, print a dimmed
  hint to stdout so the agent can optionally call the command instead
  of silently skipping the readline prompt.
- Export getDoctorSummary from telemetry/feedback.ts to share the
  system-info collector between the interactive prompt and the CLI command.
- Register the command in cli.ts and help.ts under Settings.

* fix(studio): align feedback interval to every 15 sessions

* fix: show CLI feedback on first render, Studio every 10 sessions

* feat: add env flags to disable feedback prompts

* feat: env flags to configure feedback prompt frequency

* fix: address review — agent hint reachability, cadence gate, session debounce, deprecated API
This commit is contained in:
Miguel Ángel
2026-05-28 12:17:47 -04:00
committed by GitHub
parent b7b855845a
commit d625dc8509
11 changed files with 552 additions and 99 deletions
+32
View File
@@ -25,3 +25,35 @@ export function trackStudioRenderStart(props: {
composition: props.composition,
});
}
function getBrowserDoctorSummary(): string {
try {
const nav = navigator as Navigator & {
deviceMemory?: number;
connection?: { effectiveType?: string };
userAgentData?: { platform?: string };
};
const platform = nav.userAgentData?.platform ?? navigator.platform ?? "unknown";
const parts = [
`ua=${platform}`,
`screen=${screen.width}x${screen.height}@${devicePixelRatio}x`,
`lang=${navigator.language}`,
];
if (nav.deviceMemory) parts.push(`mem=${nav.deviceMemory}GB`);
if (nav.connection?.effectiveType) parts.push(`net=${nav.connection.effectiveType}`);
if (navigator.hardwareConcurrency) parts.push(`cpu=${navigator.hardwareConcurrency}cores`);
return parts.join(" ");
} catch {
return "";
}
}
export function trackStudioFeedback(props: { rating: number; comment?: string }): void {
trackEvent("survey sent", {
$survey_id: "studio_experience",
$survey_response: props.rating,
...(props.comment ? { $survey_response_2: props.comment } : {}),
doctor_summary: getBrowserDoctorSummary(),
source: "studio",
});
}