We scanned sample-app (19 files, 396 lines) with LaunchCheck built-in checks, Gitleaks and Semgrep. After review, 68 findings remain open in 27 issue types (15 critical, 39 high, 11 medium and 3 low); 1 automated finding was dismissed as a false positive. Grade F, score 0/100: Not ready to launch. Critical issues expose data, credentials or infrastructure. The most urgent issues are Hardcoded API key or provider secret, LLM output passed to a dangerous sink and Secret exposed to the browser through a public env prefix; the table below lists the top findings with the first fix for each, and the fix plan gives the order of work.
Most severe first, one row per issue type (further places of the same issue are counted under the location). Evidence, severity basis and the fix for every place are in the full report.
| # | Severity | Finding | Location | First fix |
|---|---|---|---|---|
| 1 | critical | Hardcoded API key or provider secret | .env:4+ 7 more places | Revoke and rotate the key now, then load it from a server-side environment variable or secret manager. |
| 2 | critical | LLM output passed to a dangerous sink | agent-service/ | Never execute model output: validate it against a schema, sandbox code, run SQL read-only. |
| 3 | critical | Secret exposed to the browser through a public env prefix | .env:4+ 1 more place | Drop the public prefix, use the secret only in server code, and rotate it. |
| 4 | critical | Table created without Row Level Security | supabase/ | Enable Row Level Security on the table and add policies tied to auth.uid(). |
| 5 | critical | Private key committed to the repository | agent-service/ | Generate a new key pair, retire the old one, and keep the private key in a secret manager. |
| 6 | critical | Supabase service-role key used in frontend code | lib/ | Use the anon key in the browser; keep the service-role key on the server and rotate it. |
| 7 | high | FastAPI/Flask endpoint with no authentication check | agent-service/ | Require a signed-in user: Depends(get_current_user) in FastAPI, @login_required in Flask. |
| 8 | high | Agent tool with unrestricted shell, file or network access | agent-service/ | Restrict the tool: fixed commands, one folder, allowlisted hosts, approval for destructive actions. |
| 9 | high | Over-broad MCP server or agent permission | .mcp.json:3+ 3 more places | Limit MCP servers to the project folder, pin their versions, and keep approval prompts on. |
| 10 | high | Hardcoded password, token or signing secret | .env:10+ 3 more places | Move the value to a server-side environment variable or secret manager and rotate it. |
58 other open findings not shown here; the full report lists all 68.
Rotate every exposed credential at its provider (assume it is compromised), move secrets to server-side environment variables or a secret manager, and remove them from git history.
Enable Row Level Security on every table, replace policies that let everyone through with ownership checks, and keep the service-role key out of the browser.
Stop executing model output, keep user text out of the system prompt, cap tokens per call, and cut agent tools and MCP servers down to what they need.
Put an authentication check on every API route, then check that the signed-in user may touch the specific record.
Use parameterised SQL, remove eval/exec, run commands without a shell, and render user content as text.
Commit a lockfile, pin versions, and remove any package on the known-bad list.
Restrict CORS to your own domains, switch debug off, and rate-limit login and LLM endpoints.
After the fixes: re-run the scan to confirm each finding is gone, and rotate credentials before the next deployment, not after.
In scope: a static review of the source tree sample-app as provided on 2026-11-12: 19 text files, 396 lines. This is not a penetration test: the running application, its hosting, cloud accounts, DNS and network were not tested.
Scanners that ran: LaunchCheck built-in checks 0.1.0, Gitleaks 8.21.2 and Semgrep 1.185.0. Did not run: Trivy (fs) (skipped: not installed on the scanning machine for this run; nothing was checked by it).
This summary shows 10 findings of 68 open findings. The full report holds every finding with its evidence, severity basis, the scanners that reported it and the fix for each place, plus the scoring method, the checks that ran and the findings dismissed in review.