gdbots/ncr-bundle
A PHP bundle from Gdbots that packages NCR (Nexus Common Runtime) components into a reusable service bundle, providing shared configuration, dependency wiring, and common utilities for applications built on the Gdbots stack.
Architecture fit. gdbots/ncr-bundle remains a thin Symfony integration layer over gdbots/ncr — a DI extension, service definitions, configuration tree, and console commands/warmers wiring the NCR runtime into a Symfony container. NCR is a command-routing layer built on gdbots PBJ protobuf messages and a NATS-style transport, so this remains glue, not a standalone capability. Fit is good only if the target application is already a Symfony app willing to adopt the gdbots protocol conventions (PBJ schemas, message envelopes, routing keys). It is a poor fit for a team that wants a general-purpose command bus — Symfony Messenger already fills that role with far broader adoption. v5.0.0 does not change the architectural fit, but it changes who can physically adopt it.
Integration feasibility — this release is a material regression for most teams. v5.0.0 raises the floor to Symfony 8.x and PHP 8.5+. Both are future/bleeding-edge targets relative to any stable enterprise baseline. Concretely:
config/bundles.php, a gdbots_ncr: block, transport env vars). The real cost is unchanged: a running NATS (or compatible) broker, a PBJ schema/codegen pipeline producing PHP message classes, and version-aligned sibling bundles (pbjx, pbj, etc.). Expect a 1–2 week spike for a Symfony-fluent engineer — plus the cost of standing your platform on Symfony 8 / PHP 8.5 if it is not already there.Technical risk.
Key questions to resolve before committing.
composer.json constrain — is it ^8.0 and >=8.5, or a narrower range? Are 4.x releases still being patched with security fixes?Stack fit — revised. The floor is now Symfony 8.x, PHP 8.5+, NATS 2.x, Composer 2, and a PBJ/protobuf codegen step in CI. This is a decisive constraint: if your estate is on Symfony 6.4/7.x or PHP ≤8.4, there is no integration path on v5.0.0. Options are (a) pin to 4.x and accept the upstream-fix freeze, or (b) defer adoption until your platform's own Symfony 8 / PHP 8.5 certification lands, whichever comes first. Keep any adoption at the edge of the architecture — one deployable, one bounded context — never threading gdbots types through shared domain code.
Migration path. Do not adopt this as a platform-wide messaging standard. Recommended sequence:
CommandBus/EventPublisher interface owned by your team. Implement it with NCR (or a Messenger bridge) behind the interface. Every module depends on the interface, never on gdbots/* classes. This is your exit seam.Compatibility. Maintain an explicit matrix in the ADR: Symfony minor, PHP minor, NATS version, and the exact tuple of gdbots package versions — for both the 4.x pin and the v5 target. Because these packages release together and now track unreleased Symfony, upgrades are atomic "family upgrades," scheduled deliberately. Enable Dependabot/Renovate in grouped, manual-approval mode only; auto-merge is inappropriate here. Add a hard rule: never let composer update cross a Symfony major implicitly.
Sequencing.
| Phase | Deliverable | Gate |
|---|---|---|
| 0 | ADR: pin to 4.x vs. gate v5 on Symfony 8 / PHP 8.5 | Version story approved by platform owner |
| 1 | Spike branch: bundle boots, one command round-trips against a local broker | Confirms stack compatibility for the chosen version line |
| 2 | PBJ codegen wired into CI with schema diffing | Reproducible build, schema drift caught |
| 3 | Internal CommandBus interface + NCR adapter + in-memory fake |
Tests run without a broker |
| 4 | NATS provisioned (IaC), auth, dashboards, alerting | Ops sign-off on failure modes |
| 5 | Pilot flow in staging, then prod behind a flag | Idempotency and DLQ verified |
| 6 | Expand to additional flows | Documented runbook exists |
Maintenance. Expect to read the library source rather than documentation. Pin exact versions and budget 1–2 engineer-days per quarter for family upgrades — plus the cost of the Symfony 8/PHP 8.5 platform upgrade that v5.0.0 now implies. The v5.0.0 jump is the tell: because the maintainer tracks bleeding-edge Symfony, you should assume recurring forced upgrades on their cadence, not yours. Maintain a fork-and-own contingency: Apache-2.0 permits it, so pre-negotiate who would take over a fork and under what trigger (e.g., 6 months without a release, a blocking CVE, or a Symfony major the bundle outruns before your platform does).
Support. No vendor SLA, effectively no community. Your internal platform team is the support tier. Create a runbook covering broker connectivity loss, consumer lag, poison messages, and DI container compile failures after a Symfony bump. On v5.0.0 the compile-failure vector is sharper: the bundle sits on Symfony 8, so any mismatch between your framework baseline and the bundle's is a guaranteed deploy-time break, not a runtime surprise. Assign a named owner in the service catalog.
Scaling. Unchanged: the broker scales horizontally and consumers scale via queue groups, so throughput is not the constraint. Constraints remain (a) handler idempotency, since at-least-once delivery implies duplicates; (b) per-subject ordering, which you must not assume across subjects; and (c) protobuf schema-evolution discipline — additive-only unless you control both producer and consumer deploy timing.
Failure modes to design for explicitly.
Ramp-up. A team without event-driven experience needs roughly 2–3 weeks to become productive across three unfamiliar layers: protobuf/PBJ codegen, NATS operations, and CQRS command-routing semantics. Add the platform-upgrade overhead if adopting v5.0.0 requires standing up Symfony 8 / PHP 8.5 ahead of your normal cadence. Budget one "champion" engineer to own the pilot end-to-end. The bundle itself is small — the surrounding protocol, infrastructure, and now the version floor carry the cognitive and delivery load.
TPM recommendation — revised to watch / do not adopt on v5.0.0 without qualification. The original assessment scored this watch/contained-pilot. v5.0.0 sharpens that: the package has moved to a Symfony 8 / PHP 8.5 floor that most production estates cannot meet today, and the release demonstrates the maintainer prioritizes their own stack over broad consumability. Recommended position:
How can I help you explore Laravel packages today?