Repository navigation
docs: record the CSP-enforced production smoke re-run - #15
Merged
Merged
Conversation
Re-run the hydrated-browser smoke on c4eee46, where Content-Security- Policy is enforced, and record what it proved: the browser stays on the configured origin, CSP is derived from the same runtime config and bites in the browser, and the Reverb websocket connects under it. Correct the record on the search 500: it was not direct SQL bypassing the Scout observers. No code path applies Meilisearch index settings, so filterableAttributes stays empty until scout:sync-index-settings runs, even through the normal ingestion path. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Validation-only round, brain-only diff. No product code, Compose, Dockerfile or nginx config was touched.
Why
The earlier production hydrated-browser smoke ran on
29a7881. Content-Security-Policy (ADR-30), the optional bearer resolver (ADR-31) and correlation-ID telemetry (ADR-29) landed afterwards and changedfrontend/src/server.tsand the backend middleware stack, so that proof no longer covered the shipped code. This round re-ran it onc4eee46and added CSP to what has to be proven.What was proven
Two independent passes, each with its own public IP and ports, published on that IP only so the default origin answered connection refused.
og:url,og:imageand JSON-LD carry the configured public origin on the landing, plugin and command pages. Prerendered routes go through the same renderer, with CSP, nonce andCache-Control: no-store./runtime-config.jsserves the configured values.routerLinknavigation with no new document request — every captured request landed on a configured origin.connect-srccarries the configured API and Reverb origins and no defaults, because the header is built from the sameresolveRuntimeBrowserConfig()that serves the runtime config. Thestyle-srcnonce changes per response.disposition: enforceagainst an inline style without nonce, an inline script, a foreign script and a foreignfetch, while a style carrying the header nonce applied.pusher:connection_established.Host, and a forgedX-Forwarded-HostwithX-Forwarded-Proto: https, never reach canonical or metadata.POST /api/v1/auth/dev-loginanswers403 auth.dev_login_disabledbefore request validation.Correction to the record
The execution pass blamed a search
500(Attribute community is not filterable) on direct SQL inserts bypassing the Scout observers. The audit disproved that: a dataset built entirely through Eloquent, with observers and Horizon active, still produced an index with emptyfilterableAttributesand the same500.The real fact, now recorded: no code path applies Meilisearch index settings. Only
php artisan scout:sync-index-settingsdoes, which is the documentedREADME.mdstep. Not a regression, but the mechanism first reported was wrong and would have entered the brain as a false fact.Findings carried forward
Access-Control-Allow-Origin: *on every API response, including errors and a forgedOrigin.SecurityHeadersmiddleware.500.Gates
db:seedin the production image: FAILED, for the known Priority 13 reason.Evidence:
brain/handoffs/2026-09-23-production-smoke-csp-recheck.md.🤖 Generated with Claude Code