What the v11 upstep carries, and what an audit found inside it.
The change looks like a twelve-file diff. It re-points 27 packages onto a new branch and brings in every commit on that branch. This deck sizes the change and states its risks.
The merge request edits two feed-pin files. Those pins decide which code 27 packages are built from, so the real change is everything between the old pin and the new one.
2 feed-pin YAML files + 10 test fixtures. The description says “three files, two commits”, which is wrong.
23 Ambiorix libraries and tools plus the 4 QoS components (34 commits). 3,253 file touches in total.
Ambiorix is the middleware layer under the whole prplOS data model: the message bus, the data-model engine, the config parser and the CLI tools all live here.
Lines added and removed per component, old pin to new pin. The ten largest components carry 94% of all changed lines; the other 17 share the rest.
A defect in the first two layers is not local to one feature. It surfaces wherever the data model is used.
Ten scripted, read-only checks over git and the GitLab API: re-authored commits, sign-offs, test and CI metrics, pin consistency, feed anomalies, description accuracy, lost ticket references, default-branch coverage.
381 docs-only and version-bump commits were auto-rated OK. The remaining 632 were each read by two AI raters with opposite briefs: one assumes something could be hidden, one classifies as a maintainer would.
All 197 disagreements plus a 5% sample of agreements (219 commits) were re-read against the full diff by a separate model. Round-two findings were re-derived blind before publication.
Static analysis only. No build, no test run, no memory measurement. That is a stated scope limit, and it means every statement here is about what the code says, not how it behaves on a device.
What the 257 SCRUTINIZE commits are. New features and public-interface changes arriving inside a maintenance upstep dominate.
| # | Defect type | What it means for the product |
|---|---|---|
| 12 | Memory-safety and crash defects in bus and core libraries | Dangling pointers, use-after-free, a NULL dereference, an infinite loop and a quadratic slowdown across libamxb, libamxc, libamxd and five more. Crashes or hangs in the layer everything else depends on. |
| 3 | Public interface changed without safeguards | Includes the MR’s only memory-optimization commit: it changes public header types, stores an unowned pointer and deletes 10 test assertions. Code built against the old headers can misbehave. |
| 2 | Destructive default-config script | acl-manager gains a script that deletes a device’s saved ACL configuration on any transient read error. Only an unrelated makefile line keeps it uninstalled today. |
| 2 | Silently broken CLI tooling | A renamed config-generator option writes output to the wrong place; a CLI tool quietly stops running one of its own tests. |
| 1 | Tests removed alongside an admitted defect | Six error-handling tests for malformed config files are deleted; the commit message says the parser now leaks memory on bad input. |
| 1 | Resource leak in an always-on service | The bus statistics module leaks memory on every reset call. |
| 1 | Logging defaults changed unconditionally | Trace colours, user traces and syslog console logging are forced on regardless of configuration. |
Two of the 22 (libamxb, libamxp) were repaired by later commits inside the same range and only need confirmation.
808 of 1,013. 802 of those come from one bot account. Contributions from six external organizations now terminate at that bot with no way back to the real author.
206 commits are copies of earlier prpl commits under a new identity. Half lose every Jira key; 21 lose their whole description. The 172 back-pointers they carry resolve nowhere public.
Every package moves from a hash-checked release tarball to a moving git branch, with the mirror-hash check disabled. A build tomorrow may not contain the 1,013 commits that were audited.
Default branch vs. pinned branch. 171 commits on the components’ real default branches have no exact twin in the pinned branch. Hand review shows most are present in re-implemented form. 2 upstream bug fixes are confirmed missing from what this MR would ship; 71 commits remain unverified by automation.
Of 1,013 commits, 2 are memory optimizations and 9 are performance work: 1.1% of the import. One of the two memory commits is a blocker. No measurement was performed on either side; the audit makes no claim about footprint in either direction.
Seven TR-181 QoS classification parameters are removed as a RAM optimization. The MR does not say so. Anything that reads those parameters, including operator ACS integrations, will find them gone.
Twelve memory-safety defects are in the bus and data-model libraries. A fault there is not scoped to one feature; it shows up wherever the data model is used, and is hard to attribute back to this merge later.
Test content grows overall: +181 files, +1,765 cases, +2,390 assertions. Inside that growth two undisclosed removals sit exactly where defects were introduced. CI pass/fail data for either pin is not retrievable, so no suite’s status is confirmable.
Ordered by how cheaply they close the gap. The first two are hours of work and remove the biggest unknowns.
Twenty confirmed defects and an unpinned supply chain are each sufficient on their own.
Pinning, an honest description, blocker fixes and the data-model disclosure. Cheap, and they make the rest reviewable.
Attribution restore, per-component changelog, default-branch reconciliation. This is integration effort, and it should be scheduled as such.
Full report with per-commit evidence: prplware-v11-upstep-audit.pages.dev. Every number in this deck has a source pointer in the speaker notes.