Add internal beta feedback automation#13
Conversation
Greptile SummaryThis PR introduces the internal beta feedback surface — a full BLoC-backed form that collects bug reports from debug/beta users, stores private reports and attachments in Supabase, and queues a Codex task so a local runner can open a sanitized GitHub issue. It also removes the custom PR acceptance gate, replacing it with a Greptile-as-CI-signal workflow and private Supabase Storage for demo proofs.
Confidence Score: 4/5Safe to merge with one error-handling fix needed in the data source before beta users start filing reports. The data source's jsonDecode call on a 2xx response body is not wrapped in a FormatException catch. If the Supabase Edge Function or any upstream proxy returns a non-JSON 200, the cubit receives a generic failure and tells the user to retry — but the report was already saved. Repeated retries produce duplicate entries in the private bug store. The navigation back-button issue that affected previous iterations has been corrected; both entry points now use context.push(). lib/features/beta_feedback/data/data_sources/supabase_beta_feedback_data_source.dart — the FormatException gap on lines 63-68. Important Files Changed
Reviews (20): Last reviewed commit: "Update beta feedback queued issue flow" | Re-trigger Greptile |
|
@greptileai review this |
|
@greptileai review this |
|
@greptileai review this |
|
@greptileai review this |
|
@greptileai review this |
| final decoded = jsonDecode(responseBody); | ||
| if (decoded is! Map<String, dynamic>) { | ||
| throw const BetaFeedbackException( | ||
| 'The beta feedback service returned an unexpected response.', | ||
| ); | ||
| } |
There was a problem hiding this comment.
FormatException on non-JSON 2xx silently turns a saved report into a failure
jsonDecode(responseBody) throws FormatException when the server returns a 2xx with a non-JSON body (e.g. an HTML error page served by the Supabase CDN when the Edge Function throws, or any proxy in between). That exception is not caught here — only TimeoutException and SocketException are — so it propagates to the cubit's on Object handler, which tells the user "Please try again." The report was already persisted on the server; retrying produces a duplicate entry in the bug database. Catching FormatException separately and throwing a BetaFeedbackException with an explanatory message would prevent this.
Summary
Validation