OpenConstructionERP v12.9.0
The vector service installs somewhere it is actually allowed to write. It used to install under the account's home directory, which in a container is a path inside the image rather than the mounted volume. Docker creates a volume for such a path owned by the administrator account while the application runs as an unprivileged one, so the download failed on a directory it could not write and the failure was reported as a bare server error with nothing naming permissions as the cause. It now installs under the platform data directory, which is the volume that is already writable, so a container no longer needs its ownership corrected by hand before the CAD to cost matching flow will work. A binary already sitting in the old location keeps being used, so an install that was working is not thrown away and nothing has to be downloaded twice. A permission problem in that directory now names the path and the reason.
Records updated through the shared write path no longer make unrelated parts of the same request fail. Twenty-one places wrote a row and then marked every object loaded in that request as stale, which turned the next read of any of them, anywhere, into a database round trip that is not allowed at that point and raised an error far away from the code that caused it. The write now reconciles the row it actually wrote. This covers invoices, purchase orders, change orders, compliance documents, contacts, requirements, transmittals, submittals, requests for quotation, forms, field time entries, the BIM hub and enterprise workflows.
Reading a request for quotation now loads its bids deliberately rather than relying on that stale marking as the thing that forced a fresh read, which is what the check refusing a second award depends on.
The desktop build stops reporting a healthy PDF reader as a broken one. The diagnostic checked its readers by starting a second copy of the program, which in a packaged build means launching the application rather than the interpreter, so the check could not succeed no matter what was installed. It now imports them the same way the upload path does.
A resumable upload that loses one piece of working data costs that one piece rather than the whole transfer, so the client re-sends a single chunk instead of starting again.
The frontend lockfile is held to the same version everything else reports. It had been left behind at 12.6.1 across two releases because nothing checked it, and it is the one file the container build treats as authoritative.
Full Changelog: v12.8.0...v12.9.0