# Blockers and Guards (Shared Contract) This document defines the **shared contract** for Blockers (website UX) and Guards (API enforcement). If a more specific document conflicts with this one, this shared contract wins. Related: - API authorization: [`docs/architecture/api/AUTHORIZATION.md`](docs/architecture/api/AUTHORIZATION.md:1) - Website delivery-layer contract: [`docs/architecture/website/WEBSITE_CONTRACT.md`](docs/architecture/website/WEBSITE_CONTRACT.md:1) ## 1) Core principle (non-negotiable) Guards enforce. Blockers prevent. - Guards protect the system. - Blockers protect the UX. There are no exceptions. ## 2) Definitions (strict) ### 2.1 Guard (API) A Guard is an **API mechanism** that enforces access or execution rules. If a Guard denies execution, the request does not reach application logic. ### 2.2 Blocker (Website) A Blocker is a **website mechanism** that prevents an action from being executed. Blockers exist solely to improve UX and reduce unnecessary requests. Blockers are not security. ## 3) Responsibility split (hard boundary) | Aspect | Blocker (Website) | Guard (API) | |---|---|---| | Purpose | Prevent execution | Enforce rules | | Security | ❌ No | ✅ Yes | | Authority | ❌ Best-effort | ✅ Final | | Reversible | ✅ Yes | ❌ No | | Failure effect | UX feedback | HTTP error | ## 4) Naming rules (hard) - Website uses `*Blocker`. - API uses `*Guard`. - Never mix the terms. - Never implement Guards in the website. - Never implement Blockers in the API. ## 5) Final rule If it must be enforced, it is a Guard. If it only prevents UX mistakes, it is a Blocker.