# Clusev — STRICT RULES > **Non-negotiable.** Generated from `handoff.md` §4. These are the user's explicit, > mandatory rules. If any instruction (mine, yours, or a future agent's) conflicts with a > rule here, **STOP and ask** — do not "work around" it. Keep this file open while coding. --- ## Quick gate — run through this before every commit - [ ] **R1/R2** — Page is a **full-page, class-based Livewire component** mapped directly in `routes/web.php`. - [ ] **R2** — Livewire **class** in `app/Livewire/…` **and** a matching **separate Blade view** in `resources/views/livewire/…`. **No Volt.** - [ ] **R3** — No hard-coded hex/rgb in markup — only `@theme` token utilities (`bg-surface`, `text-accent`, …). - [ ] **R4** — No inline `style="…"` **except** a progress bar's `width`. - [ ] **R5** — Destructive/confirm action runs through a **wire-elements/modal**, never Alpine `confirm()`. - [ ] **R6** — Files placed exactly per the §5 folder map. - [ ] **R7** — Verified at **375 / 768 / 1280 px**; touch targets ≥ 44px. - [ ] **R8** — Every PHP/Composer/Node/artisan command ran **inside the container**. - [ ] **R9** — UI copy is **German**, **no emoji**; status via color/dots/pills. - [ ] **R10** — Reused existing `@theme` tokens + Blade components (no ad-hoc colors/widgets). - [ ] **Secrets** — `git status` shows **no** `.env*`, token, key, or home-dir dotfile staged. --- ## R1 — Pages are full-page Livewire components, mapped directly as routes **Why.** One page = one component = one route. No controller indirection, no orphan Blade views. Keeps routing, state, and view co-located and predictable. ✅ **Correct** ```php // routes/web.php use App\Livewire\Dashboard; use App\Livewire\Servers\Show; Route::get('/', Dashboard::class)->name('dashboard'); Route::get('/servers/{server}', Show::class)->name('servers.show'); ``` ❌ **Forbidden** ```php // Controller returning a Blade view for a PAGE Route::get('/', [DashboardController::class, 'index']); class DashboardController { public function index() { return view('dashboard'); // ❌ pages do not belong to controllers } } ``` --- ## R2 — Class-based Livewire only. Volt is FORBIDDEN. **Why.** Class + separate view is explicit, testable, and conventional. Volt single-file components hide logic in the view and are banned for this project. ✅ **Correct** — `php artisan make:livewire Servers/Show` (creates class **and** view) ```php // app/Livewire/Servers/Show.php namespace App\Livewire\Servers; use App\Models\Server; use Livewire\Component; class Show extends Component { public Server $server; public function render() { return view('livewire.servers.show'); // ← separate Blade file } } ``` ```blade {{-- resources/views/livewire/servers/show.blade.php --}}