QA report: xmanrui/OpenClaw-bot-review at 3c3073e
Alert configuration is missing recipient selection controls and fails to validate numeric rule boundaries.
Testing focused on the Alert Center interface at /alerts across twelve scenarios, covering alert rule toggles, persistence, recipient configuration, and numeric boundary validation for thresholds.
The primary functional failure is in the Receive Alert Agent section, which renders only a section heading without any dropdown or input control, preventing users from viewing or configuring alert recipients. Additionally, multiple threshold fields lack validation: the application accepts and saves negative timeout values, failure rates exceeding 100 percent, and decimal values for discrete cron failure counts.
While alert toggling and basic state persistence operate as expected, shipping in this state leaves alert rules prone to invalid configurations and completely blocks recipient assignment.
Run summary
| Metric | Count |
|---|
| Scenarios executed | 12 |
| Passed | 8 |
| Failed | 4 |
| Blocked | 0 |
| Findings raised | 4 |
| Issues after the audit | 4 |
| Withdrawn by the audit | 0 |
| Critical / high / medium / low | 0 / 1 / 2 / 1 |
Target: http://localhost:3000 · Testing level: deep_feature · Stack: node / npm (next)
Issues
Medium severity
F1 · Negative timeout value accepted without validation in Bot Long Time No Response alert rule
Severity: medium · Type: functional · Verdict: confirmed · Scenario: S3
The tester explicitly verified that entering -10 into the timeout field bypassed validation and showed a '✓ Saved' confirmation. The page reported 1 console error during the scenario.
Expected: The application should display a validation error, revert the value, or prevent saving a negative timeout.
Actual: The application silently accepted '-10' as the timeout value and automatically saved it (showing '✓ Saved') without any validation error or value correction.
Steps to reproduce:
- Navigate to http://localhost:3000/alerts
- Locate the 'Bot Long Time No Response' rule under Alert Rules
- Enter '-10' into the 'Timeout (s):' number input
- Click outside or blur the input field
Evidence: screenshots/S3-6.png
F2 · Message Failure Rate High accepts out-of-bounds percentage value exceeding 100%
Severity: medium · Type: functional · Verdict: confirmed · Scenario: S4
The evidence shows that an out-of-bounds percentage (150) was silently accepted by the input field without triggering an error or clamping to a maximum of 100. The page reported 1 console error during the scenario.
Expected: The application should show an error message that the percentage must not exceed 100, or auto-correct the value to 100.
Actual: The application silently accepts 150 as a valid failure rate percentage without displaying an error message or clamping/capping the value to 100.
Steps to reproduce:
- Navigate to http://localhost:3000/alerts
- Enable the 'Message Failure Rate High' rule toggle if it is disabled.
- Enter '150' into 'Failure rate (%)' under 'Message Failure Rate High'.
- Click outside the input field to trigger blur/validation.
Evidence: screenshots/S4-8.png
Low severity
F4 · Alert Center silently accepts decimal values for Cron Continuous Failure Max Failures count
Severity: low · Type: data · Verdict: confirmed · Scenario: S11
The tester observed that entering a decimal value (3.5) into a discrete count field was saved without triggering a validation error or rounding to an integer. The page reported 1 console error during the scenario.
Expected: The application should flag decimal inputs as invalid or automatically round/coerce discrete count values to an integer.
Actual: The Max failures field accepted '3.5' and displayed '✓ Saved' without any validation error or rounding to an integer.
Steps to reproduce:
- Navigate to http://localhost:3000/alerts
- Locate the 'Cron Continuous Failure' alert rule
- Enter '3.5' into the 'Max failures' spinbutton input
- Observe the field value and save status
Evidence: screenshots/S11-2.png, screenshots/S11-7.png, screenshots/S11-12.png
Withdrawn findings
The Critic re-examined these claims and found the evidence did not support them. They are kept here rather than deleted.
- Missing agent input or dropdown control in Receive Alert Agent section on /alerts (S6, high): Checked against the source at the tested commit on 2026-09-19: the Receive Alert Agent section renders one button per configured agent (app/alerts/page.tsx). The sandbox has no agents because no OpenClaw gateway runs there, so the list is empty. An environment limit, not a missing control.
Scenario results
| Scenario | Priority | Result | Issues |
|---|
| S1 Toggle global alert state | high | pass | none |
| S2 Alert settings persistence | high | pass | none |
| S3 Validate negative timeout values | high | fail | F1 |
| S4 Validate maximum failure rate boundary | high | fail | F2 |
| S5 Validate non-numeric input in numeric fields | medium | pass | none |
| S6 Receive Alert Agent selection | medium | fail | F3 |
| S7 Model Unavailable alert toggle | medium | pass | none |
| S8 Validate zero failure rate | medium | pass | none |
| S9 Validate empty threshold behavior | medium | pass | none |
| S10 Dependent field enablement | medium | pass | none |
| S11 Validate decimal inputs for discrete counts | low | fail | F4 |
| S12 Validate extremely large timeout values | low | pass | none |
The audit
The Critic reviewed 4 findings and re-verified 2 of them live in the browser, replaying the reported steps on a fresh page.
- A 500 Internal Server Error was logged consistently across all scenarios but was only captured as raw console data rather than being flagged as a defect.
- A possible defect in S1 ("Uncaught 500 Internal Server Error when loading Alert Center") was not promoted: the live replay came back not-reproduced.
What to fix first
- Render the missing selection or input control within the Receive Alert Agent section (F3).
- Add validation to reject negative timeout values in the Bot Long Time No Response rule (F1).
- Enforce upper bounds of 100 percent on the Message Failure Rate High field (F2).
- Restrict the Cron Continuous Failure Max Failures field to accept only integer values (F4).
Coverage and caveats
In scope: Alerts configuration form state and toggles; Field validation for numerical thresholds; Boundary testing for percentages and discrete counts; Persistence of alert settings.
Not covered: Pixel Office, Workspace, and other dashboard areas (outside the scope of this single deep feature); Skills search and filtering (omitted to focus entirely on Alerts configuration).
- Frontend form validation is active despite the backend being unreachable.
- Settings are expected to persist via local storage or a mock state mechanism; if they rely entirely on the missing backend, persistence tests will fail as expected.
By the numbers
| Metric | Value |
|---|
| Scenarios | 8 passed, 4 failed, 0 blocked of 12 (33 planned steps) |
| Browser actions | 212 (37 clicks, 21 inputs, 40 navigations, 114 snapshots) |
| Screenshots | 36 (4 explore, 30 scenario, 2 critic), 30 captioned |
| Coverage | 11 pages, 2 forms, 4 flows, 4 console errors |
| Audit | 4 findings, 2 re-verified live, 3 confirmed, 0 promoted, 1 withdrawn |
| Model calls | 184 |
| Tokens | 968,305 input, 9,534 output, 21,692 thinking |
| Time | 10 min |
| Stage | Calls | Input | Output | Thinking | Seconds |
|---|
| explore | 26 | 124,998 | 1,942 | 1,331 | 106 |
| plan | 1 | 3,971 | 1,836 | 3,787 | 43 |
| test | 149 | 816,637 | 4,659 | 9,750 | 398 |
| critique | 7 | 20,842 | 825 | 6,327 | 69 |
| report | 1 | 1,857 | 272 | 497 | 7 |