QA report: external/proofstream.site at hosted
The stream creation workflow accepts invalid contributor wallet addresses and lacks a functional payee allowlist configuration toggle.
Testing covered 12 deep-feature scenarios across the application, evaluating stream creation validation, parameter constraint handling, GitHub authentication initiation, stream directory state filtering, detail view rendering, and theme persistence.
Two high-severity functional issues were confirmed during stream configuration. The contributor wallet input accepts malformed address strings without validation and prematurely clears deployment blocking checks, and the payee mode toggle required to enable allowlist configurations is missing or non-functional on the creation page. A third finding concerning agent ceiling budget logic was withdrawn during audit.
While general browsing, theme persistence, and boundary checks passed across nine scenarios, the stream creation flow permits invalid wallet deployments and leaves payee allowlists inaccessible.
Run summary
| Metric | Count |
|---|
| Scenarios executed | 12 |
| Passed | 9 |
| Failed | 3 |
| Blocked | 0 |
| Findings raised | 3 |
| Issues after the audit | 2 |
| Withdrawn by the audit | 1 |
| Critical / high / medium / low | 0 / 2 / 0 / 0 |
Target: https://proofstream.site · Testing level: deep_feature · Stack: unknown
Issues
High severity
F1 · Contributor wallet input field accepts invalid Ethereum address strings without validation
Severity: high · Type: functional · Verdict: confirmed · Scenario: S2
I navigated to /new and entered 'not-an-ethereum-address' in the contributor's wallet field. I observed that no validation error was displayed for the invalid Ethereum address, and the 'Name a contributor' requirement was cleared from the deployment blockers checklist, exactly as reported. The page reported 1 console error during the scenario.
Expected: The application should reject non-hex/invalid Ethereum address strings and display a validation error requiring a valid Ethereum address (0x followed by 40 hexadecimal characters).
Actual: The application accepts 'not-an-ethereum-address' without displaying any format validation error, and clears the 'Name a contributor' requirement from the deployment blockers checklist.
Steps to reproduce:
- Navigate to https://app.proofstream.site/new
- Enter 'not-an-ethereum-address' into 'The contributor\'s wallet' field under section 3.
- Observe field state and validation checklist under section 4.
Evidence: screenshots/S2-7.png, screenshots/S2-9.png
F3 · Payee mode toggle between single wallet and allowlist configuration is missing or non-functional on /new
Severity: high · Type: functional · Verdict: confirmed · Scenario: S6
Navigated to /new and reviewed section '3 · THE TERMS'. The payee configuration only provides a single textbox for the contributor's wallet. There is no toggle available to switch to a Payee allowlist mode, and clicking nearby buttons like '[ ANYONE — NAME SPECIFIC ACCOUNTS ]' has no effect on the payee configuration. The page reported 1 console error during the scenario.
Expected: The UI provides an interactive toggle that switches the payee configuration from a single contributor wallet to a Payee allowlist mode.
Actual: No toggle exists to enable a Payee allowlist mode; only a single wallet input is rendered, and adjacent buttons/advanced text elements have no observable effect.
Steps to reproduce:
- Navigate to https://app.proofstream.site/new
- Scroll to section '3 · THE TERMS'
- Observe the payee configuration inputs under 'The contributor's wallet'
- Attempt to click any payee mode toggle or '[ ANYONE — NAME SPECIFIC ACCOUNTS ]' / 'ADVANCED — PAYOUT ADDRESS ▾'
Evidence: screenshots/S6-2.png, screenshots/S6-10.png, screenshots/S6-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.
- Stream creation allows Agent ceiling per certification to exceed total budget without validation (S3, medium): Scenario S4 shows that the application explicitly enforces a rule where the per-unlock cap cannot be below the budget. Therefore, a ceiling exceeding the budget is intended behavior rather than a defect. The page reported 2 console errors during the scenario.
Scenario results
| Scenario | Priority | Result | Issues |
|---|
| S1 Empty Form Submission Validation | high | pass | none |
| S2 Contributor Wallet Format Validation | high | fail | F1 |
| S3 Logical Constraint: Certification Ceiling Exceeds Budget | high | fail | none |
| S4 Logical Constraint: Daily Ceiling Exceeds Certification | high | pass | none |
| S5 Budget Boundary Values | high | pass | none |
| S6 Payee Mode Toggle Interaction | high | fail | F3 |
| S7 GitHub Authentication Flow Initiation | medium | pass | none |
| S8 Duration Field Negative Validation | medium | pass | none |
| S9 Milestone Prompt Whitespace Rejection | medium | pass | none |
| S10 Stream Directory State Filtering | medium | pass | none |
| S11 Stream Detail View Rendering | low | pass | none |
| S12 Theme Persistence Across Navigation | low | pass | none |
The audit
The Critic reviewed 3 findings and re-verified 5 of them live in the browser, replaying the reported steps on a fresh page.
- Finding F2 contradicts the constraint observed in S4, where the application explicitly requires the cap to be equal to or greater than the budget.
- The 401 Unauthorized and 429 Too Many Requests console errors are pervasive across almost all passed scenarios but were never filed as defects.
- React hydration mismatch errors (#418) are present on multiple pages (S10, S11, S12) but were ignored by the tester.
- A possible defect in S10 ("React hydration mismatch error on streams directory") was not promoted: the live replay came back not-reproduced.
- A possible defect in S1 ("Unauthorized (401) console error on stream creation form load") was not promoted: the live replay came back not-reproduced.
- A possible defect in S4 ("Too Many Requests (429) console error during form validation") was not promoted: the live replay came back inconclusive.
What to fix first
- Enforce Ethereum address format validation on the contributor wallet input before satisfying deployment checklist requirements (F1).
- Restore the payee mode toggle on the stream creation interface to enable switching between single wallet and allowlist configurations (F3).
Coverage and caveats
In scope: Stream creation form validation; Logical constraints between budget and agent ceilings; Payee configuration mode toggle; Stream directory status filtering; Theme persistence across routes.
Not covered: End-to-end stream contract deployment.
- Assuming the automated tester does not have GitHub OAuth credentials, so completing the repository linkage and full on-chain deployment is impossible.
- Assuming the test wallet is successfully pre-connected to Arc Testnet and holds sufficient native test USDC.
- Assuming the precise constraints between budget, certification ceiling, and daily ceiling require the smaller scope to not exceed the larger scope.
By the numbers
| Metric | Value |
|---|
| Scenarios | 9 passed, 3 failed, 0 blocked of 12 (44 planned steps) |
| Browser actions | 186 (23 clicks, 33 inputs, 40 navigations, 90 snapshots) |
| Screenshots | 38 (4 explore, 30 scenario, 4 critic), 30 captioned |
| Coverage | 5 pages, 1 forms, 4 flows, 2 console errors |
| Audit | 3 findings, 5 re-verified live, 2 confirmed, 0 promoted, 1 withdrawn |
| Model calls | 193 |
| Tokens | 1,184,018 input, 10,401 output, 34,827 thinking |
| Time | 16 min |
| Wallet | 0 transactions, 0 signatures, 0 refusals on chain 5042002 |
| Stage | Calls | Input | Output | Thinking | Seconds |
|---|
| explore | 29 | 240,758 | 1,916 | 3,048 | 137 |
| plan | 1 | 3,505 | 2,000 | 4,867 | 53 |
| test | 137 | 846,742 | 4,747 | 15,872 | 562 |
| critique | 25 | 91,225 | 1,497 | 10,366 | 187 |
| report | 1 | 1,788 | 241 | 674 | 7 |