Security Sweep — Public Repository & alai.no Hardening (MC #107285) Security Sweep — Public Repository & alai.no Hardening (MC #107285) Date: 2026-08-16 Scope: johnatbasicas/alai-web , https://alai.no , and https://ucenje.alai.no Production commit: 620dd3af082952b7dbded28a4c5b4685b5445366 Pull request: johnatbasicas/alai-web#2 Trigger The source repository was public and exposed tracked CLAUDE.md and .claude/** files. A full sweep was ordered to identify and remove repository, deployment, secret-handling, browser, and production exposure risks. Confirmed findings Public GitHub access exposed agent metadata and internal operational instructions. A stale index.html.bak file was publicly readable on alai.no . A hidden internal .credits.md file was publicly readable on ucenje.alai.no . Deprecated Vercel state contained expired OIDC tokens and duplicate local backups. A legacy unused mail dependency had high-severity advisories. GitHub Actions used mutable action tags; repository secret scanning and branch protection were unavailable or disabled. Pages lacked a true 404 response and a complete Content Security Policy. The contact proxy lacked bounded streaming input, complete validation, honeypot handling, safe upstream errors, and dynamic-response security headers. The GitHub Cloudflare deploy token was stale, causing repeated authentication failures. Wrangler debug logs contained local proxy shared-secret material and were too broadly readable. Remediation completed Repository and source Changed the GitHub repository to private ; anonymous raw access now returns 404. Removed tracked CLAUDE.md , .claude/** , obsolete credential-setup instructions, and legacy Vercel/mail runtime files. Removed expired Vercel token files, deprecated Vercel state/backups, vulnerable local dependencies, and ignored HTML backups. Moved legitimate non-runtime documentation and verification sources outside deployable asset roots. Removed an unrelated Azure DevOps remote from the local web repository. Cloudflare Pages Added .assetsignore protection to both Pages roots. Added deterministic public-asset preflight validation and bypass regression tests. Added real 404.html responses to both sites. Added CSP, HSTS, nosniff , clickjacking, permissions, referrer, and cross-origin headers. Removed Google-hosted font and analytics runtime dependencies instead of weakening CSP. Kept ucenje static-only by isolating its Wrangler working directory. Added edge tombstone redirects for the two stale cached sensitive paths; requests now resolve to 404. Contact endpoint Enforced JSON content type and an 8 KiB streaming body limit. Added strict name/email/message validation and conservative email grammar. Activated the existing honeypot. Restricted browser origins and unsupported methods. Added a 10-second upstream timeout and generic upstream failure responses. Added no-store and complete security headers to dynamic responses. CI and credentials Pinned GitHub Actions to immutable commit SHAs. Added Gitleaks, asset checks, Python regression tests, contact-function tests, and Dependabot. Restricted Actions to selected actions with mandatory SHA pinning and read-only defaults. Restored the valid scoped Cloudflare Pages token from the approved vault and updated GitHub Secrets without exposing the token. Verified canonical CI deployment of both Pages projects. Restricted Wrangler configuration/evidence permissions and removed debug logs containing proxy secrets. Verification Production Playwright gate: 21/21 PASS . Browser console errors: 0 . Gitleaks current tree/history: 0 findings . Semgrep OWASP/JavaScript: 0 findings . Open Dependabot alerts: 0 . Canonical GitHub Actions deployment: SUCCESS . Sensitive live paths: 404 after edge routing . Repository visibility: PRIVATE . Evidence /Users/makinja/system/evidence/107285/final-security-sweep-report.json /Users/makinja/system/evidence/107285/browser-verification.json /Users/makinja/system/evidence/alai-web-security-sweep-20260816/FINAL-REPORT.md Evidence directories are restricted to user-only access. No credential values are recorded in this page or its evidence summaries. Residual low risks GitHub branch protection for a private repository requires a paid plan. Compensating controls are enabled: private visibility, selected SHA-pinned Actions, read-only workflow permissions, Gitleaks CI, web commit signoff, and merged-branch deletion. DNSSEC and CAA remain separate registrar/certificate-issuer changes and require a dedicated controlled rollout. The edge tombstone rules should remain until the old one-week cache lifetime has fully elapsed; then revalidate direct paths before considering rule removal. Closure Technical remediation and production verification are complete. This page is the task-specific BookStack record for MC #107285.