QA report: external/bettergpt.chat at hosted
Core chat management is largely operational, but whitespace input is accepted as blank messages and the role selector cannot be navigated via keyboard.
Testing covered 12 scenarios focusing on core chat workflows, including message composition, title editing, conversation deletion, local persistence across reloads, cloning, downloading options, prompt library insertion, and search. Ten of the twelve scenarios completed successfully.
Two functional and accessibility defects were identified. Submitting whitespace-only input bypasses validation and saves empty message bubbles into the chat history. Additionally, the role selector dropdown items lack accessible roles and keyboard interaction handlers, preventing keyboard users from selecting non-default roles when composing messages.
The testing run did not include an active API key, so live response generation from model backends was not exercised, though the interface handled the absence of credentials without crashing.
Run summary
| Metric | Count |
|---|
| Scenarios executed | 12 |
| Passed | 10 |
| Failed | 2 |
| Blocked | 0 |
| Findings raised | 2 |
| Issues after the audit | 2 |
| Withdrawn by the audit | 0 |
| Critical / high / medium / low | 0 / 0 / 2 / 0 |
Target: https://bettergpt.chat · Testing level: deep_feature · Stack: unknown
Issues
Medium severity
F1 · Whitespace-only message is accepted and saved as an empty message bubble in chat history
Severity: medium · Type: functional · Verdict: confirmed · Scenario: S3
The tester's observation confirms that submitting a whitespace-only string successfully creates a blank message bubble in the chat history.
Expected: Whitespace-only messages should be trimmed and rejected without adding an empty message bubble to the chat history.
Actual: Submitting whitespace-only input by clicking 'Save' creates and appends an empty User message bubble to the chat conversation history.
Steps to reproduce:
- Navigate to https://bettergpt.chat/
- Enter whitespace characters (e.g. ' ') into the message input textbox.
- Click the 'Save' button.
- Observe that a blank User message bubble is added to the conversation.
Evidence: screenshots/S3-7.png
F2 · Role selector dropdown items lack accessible roles and keyboard navigation, causing messages to save with default User role
Severity: medium · Type: accessibility · Verdict: confirmed · Scenario: S7
The evidence supports the claim that the dropdown items lack ARIA roles and keyboard handlers, representing a valid accessibility defect that blocks keyboard-only selection.
Expected: Role selector options should be interactive, keyboard-navigable, and selectable with appropriate ARIA roles (e.g. role='option' or role='menuitem').
Actual: Dropdown items are non-focusable list items without keyboard handlers, preventing role changes and defaulting the saved message to 'User'.
Steps to reproduce:
- Navigate to https://bettergpt.chat/
- Click the role selector button next to the chat input field (labeled 'User')
- Observe the dropdown menu with 'User', 'Assistant', and 'System' options
- Attempt to navigate or select 'System' via keyboard navigation or accessibility controls
Evidence: screenshots/S7-3.png, screenshots/S7-14.png
Scenario results
| Scenario | Priority | Result | Issues |
|---|
| S1 Main page load and API key dialog dismissal | high | pass | none |
| S2 Compose and save a chat message | high | pass | none |
| S3 Empty message validation | high | fail | F1 |
| S4 Edit chat title | high | pass | none |
| S5 Delete chat conversation | high | pass | none |
| S6 Persist chat messages across reload | high | pass | none |
| S7 Change message role | medium | fail | F2 |
| S8 Clone chat conversation | medium | pass | none |
| S9 Download chat options | medium | pass | none |
| S10 Insert prompt from library | medium | pass | none |
| S11 Search chat history | medium | pass | none |
| S12 Generate response without API key | medium | pass | none |
The audit
The Critic reviewed 2 findings and re-verified 0 of them live in the browser, replaying the reported steps on a fresh page.
- The test environment did not have an API key, which prevented the testing of actual response generation, though the application handled the missing key gracefully.
What to fix first
- F1: Add input validation to prevent whitespace-only messages from being saved as empty chat bubbles.
- F2: Implement standard accessibility roles and keyboard navigation for the message role selector dropdown.
Coverage and caveats
In scope: Local chat management; Message composition and saving; Local storage persistence; Chat export and cloning features; Handling missing API key gracefully.
Not covered: API response generation with a valid OpenAI key (needs an account/paid API key, out of scope for a hosted run); Post on ShareGPT (external integration testing).
- The application relies entirely on client-side local storage for persistence across reloads.
- The initial 'Setup your API key' dialog can be safely dismissed without blocking local chat functionality.
By the numbers
| Metric | Value |
|---|
| Scenarios | 10 passed, 2 failed, 0 blocked of 12 (25 planned steps) |
| Browser actions | 122 (28 clicks, 15 inputs, 14 navigations, 65 snapshots) |
| Screenshots | 35 (3 explore, 32 scenario, 0 critic), 32 captioned |
| Coverage | 1 pages, 2 forms, 4 flows, 0 console errors |
| Audit | 2 findings, 0 re-verified live, 2 confirmed, 0 promoted, 0 withdrawn |
| Model calls | 127 |
| Tokens | 531,659 input, 6,408 output, 17,569 thinking |
| Time | 6 min |
| Stage | Calls | Input | Output | Thinking | Seconds |
|---|
| explore | 15 | 62,579 | 1,090 | 1,780 | 44 |
| plan | 1 | 2,983 | 1,688 | 3,175 | 36 |
| test | 109 | 460,029 | 3,158 | 10,096 | 276 |
| critique | 1 | 4,501 | 230 | 1,994 | 17 |
| report | 1 | 1,567 | 242 | 524 | 6 |