coverage
105 documentation pages, 0 blanks
The coverage index in MAP.md section C gives every Laravel documentation page a verdict. A blank verdict is a build failure, so the set below is exhaustive by construction.
fits 15
- configuration, frozen at build + secrets
- contracts, type-erased; two-sided custom drivers
- csrf, session token; @csrf/@method
- deployment, build → wrangler deploy (D1 + assets)
- frontend, Vite unchanged; proven
- http-client, fetch (already HTTP)
- installation, toolchain (§7)
- lifecycle, §3 execution model
- migrations, ops-time; remote via wrangler/SQL
- pagination, kernel paginator
- routing, compiled router
- structure, §7 source of truth
- testing, local PHPUnit + edge parity harness
- urls, url/route/asset; signed URLs
… 1 more, all in the same class.
soft 59
- ai-sdk, HTTP + streaming via fetch fits
- authentication, kernel SessionGuard oracle-verified (M14); wired M15 to M20 (auth.test 4/4, login-flow E2E)
- authorization, the Gate facade compiles: Gate::allows()/denies() answer from the compiled policy (the guest rules included); authorize()/any()/define()/before() fail loud
- billing, Cashier via fetch; webhooks = HMAC routes (padanan)
- blade, views compile (echo/if/loops/expr); the layouts compile too (M40: the sections travel to the layout, @extends/@section/@yield); the Blade components (<x-...>) stay a port
- cache, the Cache facade + the cache() helper compile to the D1 database store; the tags need a taggable store (LW002, the D1 store has none, Laravel throws there too); a non-database driver fails the build (it would read and write a different store)
- cashier-paddle, same as billing (padanan)
- collections, kernel shim subset; fail loud per method
- concurrency, Promise.all; 6-conn limit → batch
- container, compile-time DI subset
- context, request-scoped shim
- controllers, M10/M17/M22/M23/M28: GET/POST/PUT/PATCH/DELETE actions compiled (one handler per verb); \->validate() + flash (M19); edirect()->intended() + session regen/invalidate (M20); FormRequests, Cache/Hash/Storage facades, class constants and Eloquent writes compile (M23/M28); the route-model binding compiles (M40: show(Post $post) fetches the model from the segment); pagination + Eloquent relations still a port; fail-loud LW002 (unsupported construct) / LW003; REQUEST_CALL synced to kernel (#2: date removed, str added)
- database, D1 builder: where/or/join/group/having
- database-testing, sqlite↔D1 parity harness
… 45 more, all in the same class.
hard 5
- broadcasting, SSE/polling padanan; WS via DO/external
- images, no GD/Imagick → CF Images or build-time
- processes, no process spawning → off-edge padanan
- redis, KV/D1 drivers; Upstash REST optional
- reverb, WS server → DO/external/SSE padanan
not applicable 26
- ai, dev tooling (Boost/AI guidelines)
- artisan, local-only; edge CLI equivalents
- boost, dev tooling only
- console-tests, local; edge = parity harness
- contributions, meta
- documentation, meta (TOC page)
- dusk, local browser tests
- envoy, local (SSH deploys)
- folio, NOT ported (0 code); Laravel Folio page routing unsupported
- homestead, local VM
- horizon, Redis dashboard; padanan CF dashboard
- http-tests, local; parity harness covers
- license, meta
- mix, legacy; Vite is the path
… 12 more, all in the same class.
measured, not assumed
What the CPU budget actually did
The repository's tools/cpu-gate.mjs deploys a probe worker and reads the platform's own cpuTime and outcome back through wrangler tail. The cells below are copied from COMPILED.md, which records the run date and the probe worker's name, and the build asserts that every phrase they were transcribed from is still in that file.
| load | p50 | p95 | max / kill | what it is |
|---|---|---|---|---|
| page-like kernel load | 5 ms | 41 ms | 62 ms | 5 hot paths × 50 iterations, 200 requests / 4 connections |
| bcryptjs cost 10 (login path) | 93 to 104 ms | not measured | not measured | kept off every per-page path; native PBKDF2 of at most 100k iterations = 22 ms fallback |
| burn control (must be caught) | about 2020 ms | n/a | killed | Free plan kills a single over-budget request at cpu=2020 ms, 1102 exceededCpu |
The p50 fits the 10 ms budget; the p95 tail is four times over it. The project states this itself and treats the tail as a design smell, not as headroom to spend.
feature map
49 rows, 7 areas
MAP.md section 5, one row per Laravel capability: what it maps to on the edge, whether it fits, and the plan letter that carries it.
| area | Laravel | edge equivalent | class | plan |
|---|---|---|---|---|
| A. Routing & HTTP | Basic routes, params | Compiled router (pattern match) | fits | F |
| A. Routing & HTTP | Named routes, route(), url() | Frozen name map | fits | F |
| A. Routing & HTTP | Route groups / middleware | Compiled pipeline | fits | F |
| A. Routing & HTTP | Redirects | Response redirect | fits | F |
| A. Routing & HTTP | Signed URLs | HMAC in kernel | fits | F |
| A. Routing & HTTP | Route model binding | Compiled lookup | soft | F |
| A. Routing & HTTP | Custom middleware | Compiled like controllers | fits | F |
| A. Routing & HTTP | Throttle middleware | Counter in D1/KV | fits | F |
| A. Routing & HTTP | CSRF | Token in session store | fits | F |
| A. Routing & HTTP | Cookie encryption | Laravel Encrypter parity (AES-CBC + HMAC) via WebCrypto | fits | F |
| B. Views | Echo, @if/@foreach/@include/@extends/@section... | Compiled JS render fns | fits | F |
| B. Views | @vite / @fonts | Runtime shim reading build manifest | fits | F |
| B. Views | @php blocks | Restricted subset | soft | F |
| B. Views | Blade components (x-..., slots) | Phase 2 | soft | F |
| B. Views | Custom directives | Registered renderers | soft | F |
| C. App code | Controllers / closures | PHP-subset → JS | fits | F |
| C. App code | Service classes / helpers | PHP-subset → JS | fits | F |
| C. App code | Form Requests | Compile rules + authorize | fits | F |
| C. App code | Validation | Rule subset in kernel; unique/exists via D1 | soft | F |
| C. App code | Events / Listeners | Synchronous compiled | fits | F |
| C. App code | Exceptions / error pages | Kernel map → static error pages | soft | F |
| D. Data | Migrations | PHP-side, applied to remote D1 (SQL export / wrangler) | fits | F |
| D. Data | Seeders / factories | Local + SQL import | fits | F |
| D. Data | Eloquent CRUD | Generated model metadata + D1 | soft | F |
| D. Data | Relationships | includes / eager subset | soft | F |
| D. Data | Casts / accessors | Compiled | soft | F |
| D. Data | Query builder subset | Kernel builder → SQL | soft | F |
| D. Data | Raw SQL | Pass-through to D1 | fits | F |
| D. Data | Transactions | D1 atomic batch() | soft | F |
| D. Data | Pagination | Length-aware paginator | fits | F |
| D. Data | Search | D1 (SQL LIKE / FTS5); vector → CF Vectorize padanan | fits | F |
| E. State & security | Sessions | D1-backed store + encrypted cookie | fits | F |
| E. State & security | Auth (guard, login/logout, remember) | Kernel + D1 users | fits | F |
| E. State & security | Password hashing | bcrypt via bcryptjs ($2y$ parity) | fits | F |
| E. State & security | Rate limiting | D1 counters (cache table) | fits | F |
| F. Platform services | HTTP providers (Resend etc.) via fetch | soft | F | |
| F. Platform services | Queues / Jobs | Cloudflare Queues (a limited version on the Workers free plan; the paid plan charges per operation - 10,000 operations/day included on the free plan) or D1 queue | soft | F |
| F. Platform services | Scheduler | Cron Triggers → one dispatcher reads schedule | soft | F |
| F. Platform services | Cache | D1 database store (Laravel parity) + KV cache-aside | fits | F |
| F. Platform services | Storage / filesystem | Uploads → R2 or the D1 blob store; file_exists/public_path → build-time snapshot | soft | F |
| F. Platform services | HTTP client | fetch | fits | F |
| F. Platform services | Logging | Console + optional external sink via fetch | soft | F |
| F. Platform services | Realtime / WebSockets | Polling / SSE; Durable Objects beyond | hard | F* / $ |
| F. Platform services | i18n | Lang frozen to JSON; pluralization subset | soft | F |
| G. Frontend / DX | Vite build | Unchanged | fits | F |
| G. Frontend / DX | Artisan | Local only; edge CLI (build/ship) | fits | F |
| G. Frontend / DX | PHPUnit | Local unchanged; parity suite added | fits | F |
| G. Frontend / DX | Livewire / Inertia / Filament | Out of v1; Inertia feasible (JSON port) phase 3; Livewire hard | hard | later |
| G. Frontend / DX | Telescope / Horizon / Debugbar | Local-only tools | not-applicable | F |
provenance
Where each figure comes from
Nothing in this audit is typed by hand: scripts/extract-lw.mjs reads the repository and scripts/verify-lw.mjs fails when a figure drifts from the file it was read out of.
- 118 constructs, 47 compiling
read from
tools/constructs.json; checked against README.md counter block, COMPILED.md audit table - 47 of 47 facades classified
read from
the vendored Illuminate/Support/Facades directory (Laravel 13); checked against the facade census completeness check - 55/55 Blade cases byte-identical
read from
the recorded oracle run against PHP 8.3.30; checked against declared counter block in README.md - 105 docs pages with a verdict
read from
MAP.md section C; checked against README.md docs counter - 49 feature-map rows
read from
MAP.md section 5; checked against the §5 area tables, counted line by line - 20 ledger rows, 12 corrections
read from
notes/PLAYBOOK.local.md (working-tree note, not in the repository); checked against an independent scan of the G.3 section (all 20 rows)