diff --git a/CLAUDE.md b/CLAUDE.md index 124f5c5..6e95f82 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -62,7 +62,7 @@ All shippable work commits **directly to `main`**; `main` is always equal to wha ## Live validation -Live validation of a user-facing feature must exercise the real UI/user flow end-to-end (e.g. connect → enroll → deploy), not shortcut via direct API/agent/CLI calls — a shortcut can give false confidence and leave the system inconsistent (see the F9 storage episode). Low-level mechanism tests where the direct call IS the mechanism are exempt. +Live validation of a user-facing feature must exercise the SERVER-SIDE PIPELINE a real user triggers, end-to-end (e.g. connect → enroll → deploy). The forbidden shortcut is BYPASSING that pipeline — e.g. raw agent guest-attach + hand-set state instead of the enrollment flow (the F9 episode) — which gives false confidence and leaves the system inconsistent. INVOKING THE EXACT ENDPOINT THE UI INVOKES — so the full server pipeline (gates, env injection, pre-create belts, compose generation) runs — is an ACCEPTABLE proxy when a browser-automation tool isn't available: it differs fundamentally from the F9 bypass because no server logic is skipped, only the browser rendering. The residual that proxy does NOT cover is purely client-side (progress panels, card/health rendering, client-side guards like checkBeforeDeploy); for strict end-to-end UI coverage use a real browser tool or a manual click-through — and SAY which was used. Low-level mechanism tests where the direct call IS the mechanism remain exempt. **Browser automation is available** for that real-UI validation: the Claude Code↔Chrome bridge (`claude-in-chrome`) is installed, so CC can drive the dashboard / FileBrowser / app admin UIs at