[PASS] Required file: app/bootstrap.php
[PASS] Required file: app/content_helpers.php
[PASS] Required file: config/config.example.php
[PASS] Required file: database/schema.sql
[PASS] Required file: public/login.php
[PASS] Required file: public/logout.php
[PASS] Required file: public/index.php
[PASS] Required file: public/content.php
[PASS] Required file: public/edit-content.php
[PASS] Required file: public/preview.php
[PASS] Required file: public/collections.php
[PASS] Required file: public/media.php
[PASS] Required file: public/users.php
[PASS] Required file: public/revisions.php
[PASS] Required file: public/backups.php
[PASS] Required file: public/redirects.php
[PASS] Required file: public/settings.php
[PASS] Required file: migration/articles-import.json
[PASS] Required file: migration/media-migration-manifest-20261015-232234.json
[PASS] Required file: storage/.htaccess
[PASS] CSRF verification function exists
[PASS] Session strict mode enabled
[PASS] Cookie-only sessions enabled
[PASS] Security headers present
[PASS] Login rotates session ID after success
[PASS] Login uses password_verify
[PASS] Login throttling uses attempt records
[PASS] Content editor verifies CSRF on POST
[PASS] Content editor sanitizes rich HTML
[PASS] Content editor validates slug syntax
[PASS] Published slug change requires approval
[PASS] Approved slug change writes redirect
[PASS] Preview is noindex
[PASS] Media upload verifies CSRF
[PASS] Media uploads use MIME detection
[PASS] Media upload enforces file size limit
[PASS] Backup export requires permission and CSRF
[PASS] Redirect changes require permission and CSRF
[PASS] Schema table: users
[PASS] Schema table: roles
[PASS] Schema table: permissions
[PASS] Schema table: user_roles
[PASS] Schema table: role_permissions
[PASS] Schema table: content_items
[PASS] Schema table: content_revisions
[PASS] Schema table: url_redirects
[PASS] Schema table: media_assets
[PASS] Schema table: site_settings
[PASS] Schema table: audit_logs
[PASS] Schema table: login_attempts
[PASS] Article import manifest parses
[PASS] Article manifest has 77 records — found 77
[PASS] Article slugs are unique
[PASS] Media manifest exists
[PASS] Media manifest parses
[PASS] Media manifest has 474 assets — found 474
[PASS] No production config bundled
[PASS] Storage directory has access protection

Summary: 58 passed, 0 failed, 58 total
Static source checks only. MySQL, HTTP/browser, media serving and restore workflows remain unverified.
