gcego/runtime
gcego/runtime is a lightweight Laravel/PHP package that provides a runtime layer for managing execution context and service bootstrapping. It integrates cleanly with existing applications and helps keep runtime concerns organized and predictable.
Architecture fit
gcego/runtime from a mixed execution+rendering package into a single-purpose execution kernel. This is a net positive for architectural clarity: one entry point (Runtime::execute()) for actions, queries, form submissions and package-defined operation categories, rather than ad-hoc controllers/Livewire calls scattered across the app.gcego/core, gcego/registry, gcego/blueprints, plus the new gcego/rendering). Our dependency graph gains a mandatory node and, more importantly, a new release-coupling obligation: runtime 1.x cannot ship independently of core 1.x, registry 1.1.x and blueprints 1.0.x.Operation value object (immutable, identifier-only targets, data-only input) is the right shape for a TPM-governed platform: it makes operations inspectable, loggable and testable, and it structurally prevents callers from smuggling objects or closures into an execution path.ExecutionContext built from the guard plus TenantResolver/PanelResolver contracts — explicitly never from request input — is a strong multi-tenant and authorization posture. This is the single most valuable property in the release from a risk perspective.GateExecutionAuthorizer (ability gcego-runtime.execute) is the correct default. It also gives us a familiar Laravel lever (Gates/policies) for governance, audit and per-tenant enablement.RuntimeInspector, RuntimeReport::$handlers, RuntimeDiagnostic, gcego-runtime.execution Core diagnostic) is unusually good for a package at this maturity and materially lowers our support cost.Integration feasibility
livewire/livewire, illuminate/view and gcego/components from runtime's dependency set is a genuine win — the kernel is now headless and can be adopted by API-first services that have no view layer.TenantResolver and PanelResolver (or accepting defaults). For a multi-tenant SaaS these are non-trivial implementations and must be treated as part of the integration scope, not an afterthought.HandlerRegistry (categories action, query, form, plus package-defined) is straightforward; the Bootable::bootPackage() + Extensions\ExecutionExtension path means our Core extensions can register middleware and handlers declaratively rather than in service providers.Technical risk
gcego/rendering with a different namespace and renamed symbols: Runtime::render(), renderAuthorized(), identityOf(), canRender() → Gcego\Rendering\RenderEngine; hostedBlueprint() → authorizedBlueprint(); Blade component <x-gcego-runtime::render> → <x-gcego-rendering::render>; config namespace gcego-runtime.rendering.* / .authorization.* → gcego-rendering.*; ability gcego-runtime.render → gcego-rendering.render. Every existing Blade template, gate check and published config file is affected.gcego-runtime.render string will simply never match, and depending on how GateRenderAuthorizer behaves, this can fail open or produce confusing denials. Must be verified explicitly in test coverage, not assumed.Rendering\BlueprintRenderer, Livewire\BlueprintHost, renderers.blueprint / hosts.blueprint views, gcego-runtime.livewire.* config, and the runtime.livewire capability. There is no drop-in equivalent for blueprint-as-component rendering, because blueprints 1.0 no longer models blueprints as components. Any screen relying on <x-gcego-runtime::...> blueprint hosting needs a redesign, not a rename.RuntimeInspector::inspect() signature change (no target argument) and RuntimeReport losing renderers/missingRenderers will break any internal health-check or admin dashboard we build on it.RuntimeConfig now throwing InvalidConfigurationException and holding execution settings only means config files must be republished, not merged. Stale config keys will be silently inert.execution.max_depth nesting limit plus "refusal to execute before Core has booted" are all correct, but they convert misconfiguration into hard runtime failures — good for safety, but they raise the bar on our pre-deployment validation.Key questions
GateExecutionAuthorizer fail closed when no Gate is defined for gcego-runtime.execute (deny-all), or does it fall through? Same question for gcego-rendering.render.BlueprintHost / Livewire\BlueprintHost — is there a documented pattern, or is blueprint hosting now explicitly the host application's responsibility?gcego/rendering versioned and released in lockstep with runtime, and does it have its own support policy?Stack fit
gcego/core ^1.0, gcego/registry ^1.1, gcego/blueprints ^1.0, gcego/runtime ^1.0, and — for any app with a UI — gcego/rendering (newly added to the dependency list, at whatever version its README specifies).gcego/rendering becomes a first-class dependency rather than an implicit one.composer.json and add a CI job that resolves the constraint set on a clean install; the four-way coupling is the most likely source of "works on my machine" breakage.Migration path
Runtime::render, renderAuthorized, identityOf, canRender, hostedBlueprint, Gcego\Runtime\Rendering, Blade\BladeRenderer, Styling\, State\, RendererInterface, StylingResolver, RenderAuthorizer, StatefulComponent, Security\GateRenderAuthorizer, x-gcego-runtime::render, gcego-runtime.rendering, gcego-runtime.authorization, gcego-runtime.render, gcego-runtime.livewire, RuntimeInspector::inspect(, RuntimeReport->renderers, ->missingRenderers. This list is the migration backlog.gcego-rendering config for UI apps; prune gcego-runtime.rendering.*, .authorization.* and .livewire.* blocks. Add gcego-runtime.execution.{ability,middleware,max_depth}.gcego-runtime.render to gcego-rendering.render in the same commit as the package bump. Write a test that asserts the old ability grants nothing and the new one grants correctly.Gcego\Rendering\RenderEngine, with the hostedBlueprint() → authorizedBlueprint() rename called out as a distinct, reviewable change.HandlerRegistry, implement TenantResolver/PanelResolver, bind GateExecutionAuthorizer, then begin routing new features through Runtime::execute().Compatibility
RuntimeInspector::inspect() arity, RuntimeReport shape, removal of Rendering\BlueprintRenderer and Livewire\BlueprintHost, removal of runtime.livewire capability.RuntimeConfig throwing InvalidConfigurationException will surface stale config as a boot-time failure; Bootable::bootPackage() refusing execution before Core boots may change startup ordering assumptions in existing service providers.RuntimeReport->renderers / ->missingRenderers (health checks, admin panels) breaks silently in the type sense — audit these deliberately.Sequencing
gcego/rendering dependency and config baseline, standardise the new ability names, and land TenantResolver/PanelResolver implementations once for reuse.gcego/rendering and gcego/runtime bumps in the same PR; splitting them creates a window where rendering call sites exist with no rendering package.Maintenance
illuminate/view), which partially offsets the added package count.RuntimeConfig is execution-only and throws on invalid config, so stale published config becomes a boot failure rather than a warning. Add config validation to CI.gcego/*. We should document an exit cost for each.Support
ExecutionTrace, the three lifecycle events (OperationExecuting/OperationExecuted/OperationFailed), and ExecutionException subclasses each carrying an ErrorCategory with an HTTP status and a public message. Build a triage runbook that maps ErrorCategory → cause → owner.RuntimeInspector / RuntimeReport is the go-to diagnostic for "handler not registered", "override shadowing", "wrong middleware order". Expose it in a support-facing command or admin endpoint, and account for the new no-argument signature.render, hostedBlueprint, gcego-runtime.render) or the first ticket after cutover will go down the wrong path.Scaling
Operation objects scale well horizontally: operations are cheap value objects, resolution is a registry lookup, and there is no rendering tree in the hot path for API workloads.execution.max_depth bounds nested operations, which is the right guardrail — but nested execution inside a single request is a latency multiplier. Instrument depth and pipeline duration before raising the limit; treat the default as a budget, not a suggestion.ExecutionScope keeps contexts isolated per request, so context bleed across nested or long-running operations is contained. Confirm behaviour under queue workers and Octane-style long-lived processes, where "scoped" and "singleton" are meaningfully different.gcego/rendering's problem plus Livewire's; decoupling means a rendering regression can no longer take down the execution kernel, which is a real availability improvement.Failure modes
gcego-runtime.render grants nothing; new gcego-rendering.render unvalidated. Highest-probability, lowest-visibility failure in this release. Cover with an explicit deny test.gcego/rendering, any render call site fatals at class-not-found. Mitigated by shipping both together.max_depth throws ContextViolationException/InvalidOperationException depending on the path; nested features that previously worked implicitly may start failing. Load-test with realistic nesting.HandlerFailedException plus OperationFailed events must not leak internal messages into the public ErrorCategory message. Verify the public/internal message split before exposing to clients.InvalidConfigurationException on every request if config is stale — effectively a total outage from a mis-merge. Config linting in CI is the cheapest mitigation available.Ramp-up
Runtime::execute() as the single entry point, the immutable Operation (identifier-only target, data-only input), the trusted ExecutionContext and the rule that context never comes from request input, the seven handler contracts, and the ErrorCategory model.Operation::make() to a traced ExecutionResult in under an hour.How can I help you explore Laravel packages today?