Repository navigation
OpenConstructionERP v17.2.0
The regional exchange screens offer a sample budget so a visitor can try the importer without a file of their own, and the Spanish one failed twice over, in two places that could not see each other. The origin would not serve it: a request for the .bc3 came back with 200, a content type of text/html and six kilobytes of the application shell, because that suffix was not among the ones the server hands back from the bundle root, and anything else falls through to the page. So the link handed a visitor an HTML error page under a .bc3 name. The file itself was written to a record layout nothing in this product uses, with a currency where the price belongs and its quantities in the decomposition records rather than the measurements, which parses without a single error and imports nine rows: three chapters as priced work items, five items with no rate and no quantity, and the budget header as a position priced at twenty six million, which is the file's date read as money. It is rewritten to the layout the reader reads and the writer writes, and it now imports as three chapters and five items totalling 75,483.00 EUR and survives a trip out through our own exporter and back in. A test asks the two questions that separate a sample that works from one that merely exists, whether the origin can serve the bytes and whether an importer turns them into a budget with money in it, over every sample the product ships.
The preview beside that drop zone was reading files it cannot read. It is a delimited text reader, and it was handed everything the screen accepted, so a native Spanish budget was split on commas anyway and reported the rows it made up, two, cut out of the file's long text records, while the server read the same bytes as nine. The button then said import two positions and the result said nine. The same credulity is what let an HTML error page saved under a .bc3 name parse into three confident looking positions with a format badge beside them. A format the browser cannot read now says so in one line, naming the reader that will take the file, and imports exactly as before, since the request always posted the file whole and the server always chose the reader. The button is labelled by the file in that case rather than by a count the browser never counted.
Thirty three guided cases open nine more markets. Australia, New Zealand and Brazil get nine each, the three that had a country screen and a regional pack and almost nothing a person could follow, and six single cases cover an obligation one market carries and its neighbours do not: the Mexican precio extraordinario outside the catalogo, the Hungarian fedezetkezelo, the Saudi Wafi escrow draw, South African measurement to ASMM 6, the Davis-Bacon certified payroll and the Russian handover to vvod v ekspluatatsiyu. They are written as the sequence of decisions the work takes. NZS 3910 carries the 2023 split of the Engineer into a Contract Administrator and an Independent Certifier, because a variation administered as though one person still holds both hats is the commonest way a good entitlement is lost on that form; AS 4000 and AS 2124 are set beside each other rather than treated as one contract; and the Brazilian nine follow a public job from the SINAPI reference price through the BDI under Acordao 2622/2013-TCU and the encargos sociais to the annual reajustamento, which is the order the numbers are actually built in. The library goes from 260 cases to 293, and every card, its title, its description and its long description, is translated into all 36 offered languages. Named laws, standards, forms and registers stay in their own language, since a reader who cannot look the standard up has not been helped.
The macOS desktop build asked the system for a protection it had no identity to satisfy. Bundled PostgreSQL would not initialise, and the loader said a library and the process loading it have different team identifiers on a machine where neither carries one, which is library validation rather than the quarantine everybody reaches for first. The cause is one string: the build spec set the signing identity to a dash meaning ad-hoc, and the packager reads that field as whether a real developer identity was named, so it turned the hardened runtime on for every binary it collected while passing no entitlements at all. The hardened runtime requires each library to carry the process's own team identifier and an ad-hoc binary has none, so the load is refused. Since 14.7.0 the outer application is signed again afterwards and is healthy, and nothing reaches the binaries inside the archive, which is why the application starts and dies in its child processes instead. The existing signature check was green on the broken build by construction, because it asks whether the pieces agree with the wrapper and on that build all 76 of them agreed by being equally unsigned; the new one asks the question that separates them, whether a binary carries the runtime flag and no team identifier, and both are proved on one stubbed archive, one exiting clean and one failing.
The Windows start-up sweep cleans a folder the copies it was written for are not in. 17.1.0 moved the unpack out of the temporary folder and added a sweep for what a killed run leaves behind, and both are right and neither helps the person the change was made for, whose leftovers were written by earlier versions and are therefore in the temporary folder the sweep does not look at. So the refusal says where the space went. When a start is stopped for want of room, and only then, the launcher counts what earlier versions left, and it counts rather than deletes: two such directories measured on a development machine hold 2.73 GB on a drive with 2.1 GB free, which is to say the application's own abandoned copies are larger than all the space that is left. A directory is only described as ours when it carries all three of the files our own unpack writes, the walk is bounded and says so when it stopped early, and a full drive is named now with what happened, where, how much room is left and what to do, rather than passed along as an error number.
The demo seeder inserted a record it had already inserted, and lost the rest of the run with it. Every second boot of a seeded install failed on the unique index behind the CAD extraction session: the row was added with no check, sat pending, and the next project's first query flushed it into the index. Demo enrichment gives each seeder one transaction and logs and moves on, so the documents, the measurements and the cleanup of that run went with the failing row, which is why a showcase in that state never healed by itself. The insert checks for its own row now and sits in a nested transaction so a second worker booting at the same moment loses that row alone. The seeded session also paired a permanent flag with an expiry a week out, and the two readers disagree about which column decides, so a week later the workspace listed an extraction and returned nothing when it was opened; it is minted with the same lifetime the product writes when a person makes a session permanent.
A route the application serves that the public proxy does not know about never reaches the application at all, and on 9 September that was the entire regional exchange feature, the hub and twenty country screens, answering 404 on the public origin while being built, bundled and served. The gate that exists for this had been run that same day and saw three of the twenty four missing, because it read the router file alone and those routes come from a module manifest that builds them from a table of markets. There is one collector now and both gates read it. It scans TypeScript with a small state machine that separates code from strings, comments, regular expressions and template literals, resolves a path built from a table, and turns anything it cannot resolve into a named failure rather than a shorter answer; it also cross-checks the manifests on disk against the module registry in both directions, so a third source of routes cannot appear quietly. It runs in repo hygiene and on commit, against a mirror of the proxy's own list that is extracted from a real configuration and never generated from the routes.
Full Changelog: v17.1.0...v17.2.0