Codifies the rule that every class referenced via `$c->get(X::class)` inside a container registrar must itself be bound via `$container->set(X::class, ...)` somewhere — in the same registrar, in core/App/registerContainer.php, or in a module container registrar. Catches the bug pattern fromcd2c9c5: a registrar's factory closure pulled UserSettingsGateway via $c->get() but no matching ->set() ever ran. Unit tests with mocked dependencies passed; the failure only surfaced at runtime ("Service not bound: ...") when the affected admin/settings/user-lifecycle page tried to construct the dashboard service against the live container. Implementation is purely static — token / regex parsing of registrar files plus class_exists() / interface_exists() gating to avoid false positives on non-class identifiers. No factory invocation, so the test does not require DB / session / HTTP and is fast. Verified by reverting thecd2c9c5binding line in the working tree and running the test — it produces the exact "UserSettingsGateway referenced in core/App/Container/Registrars/UserRegistrar.php" finding. Restored after the dry-run. Allowlist starts with two framework-bootstrap classes (AppContainer, ModuleRegistry) that are bound outside the registrar mechanism. Each future addition needs an inline justification. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7.7 KiB
7.7 KiB