Triangle compatibility and verified startup
Package constraints and actual runtime
Section titled “Package constraints and actual runtime”Engine declares PHP ^8.1, intl/json and Server ^4; the Web scaffold requires PHP ^8.2 and curl/json. Keep these layers separate. The Server 7 recipes do not prove Triangle compatibility.
Executed scenario, 2026-10-17
Section titled “Executed scenario, 2026-10-17”The quick start route returned HTTP 200 and {"message":"Hello, Reader"} in an isolated Web copy using PHP 8.3, Engine 8.1.10, HTTP 2.0.10, Router 2.0.5 and Server 4.5.1. The fixture reused the installed dependency set, added an integer worker-count cast and disabled the process monitor. It does not prove a fresh create-project resolves to the same set. Commit your application lock and test it separately.
PHP 8.5.4 startup with this installed set failed before the route: Console 1.1.8 implicitly nullable parameters trigger deprecations, converted to exceptions by Engine’s error handler. Do not claim PHP 8.5 support from a broad Composer constraint. Do not hide deprecations as the compatibility fix. PHP migration note.
The Web config also passes SERVER_COUNT through as a string. Use the explicit numeric cast in the quick start; otherwise the typed Server start helper can throw TypeError.
Response and bootstrap differences
Section titled “Response and bootstrap differences”Use responseJson($data, $status) for a direct JSON contract. response($data, $status) has different envelope/debug/view behavior and can honor http_always_200. Use view() for the configured renderer, not a nonexistent View facade. Routes are registered by executable config/route.php; ordinary config files return arrays. Match controller namespace and directory case.
Remaining coverage
Section titled “Remaining coverage”The legacy component guides still contain unverified examples. The SaaS template pages were quarantined rather than published as Triangle API. Middleware, database/session lifecycle, plugins, worker reload and production behavior require separate executable checks. A successful minimal route does not mark the framework reviewed in full.