PCLI2

v1.17.0

v1.17.0 Jul 31 2026 at 02:21 UTC

Fixed

  • Folder match output is now reproducible (#82) - Two identical runs over unchanged data produced reports that differed byte-for-byte. Rows were collected in whatever order the concurrent searches finished, and for a symmetric pair the surviving row was whichever direction arrived first — so which asset appeared as the reference varied between runs. Matches are now deduplicated into an ordered map keyed on the unordered pair, so both the row order and the choice of orientation are properties of the data rather than of the run's scheduling. When a pair is searched from both ends the record whose reference sorts first is kept; a pair searched from only one end keeps that direction, and no record is ever rewritten to look canonical, since the transformation matrix and comparison URL describe one direction and flipping them would corrupt both. Two runs over unchanged data now produce identical bytes, so reports can be diffed and version-controlled.
  • A folder match run now stops after repeated authentication failures, instead of issuing thousands of doomed requests (#78) - When the token expired partway through a long run and automatic re-authentication failed, every remaining asset failed identically: 21,068 of them on one run, each logging its own copy of the same error, taking the full ~25 minutes and ~21,000 pointless API calls to finish. A run now stops after three consecutive authentication failures, and the reason is reported once rather than once per asset. Consecutive, not the first: the client renews the token and retries automatically — which is what lets a long run survive its credentials expiring halfway through — and a failed renewal is reported the same way whether the credential was rejected or the auth endpoint merely hiccuped, so stopping on the first would abandon a long run over something the next request would have recovered from. Any successful search resets the count, so scattered blips are absorbed while a genuinely dead credential trips it almost immediately. Assets that were never searched are counted separately from ones that were tried and failed (Searched 1,259 of 22,378 asset(s): 1 failed, 21,067 not attempted, 51 not searchable).
  • Folder match commands no longer report success when most of their searches failed (#77) - A failed per-asset search contributed nothing and was otherwise indistinguishable from an asset that genuinely had no matches, so nothing counted failures and nothing could report them. A run that lost 21,119 of 22,378 searches to an expired token still exited 0 and printed a normal completion summary, handing over a report missing 94% of its rows. Failures are now counted and reported whenever any occur (Searched 1,259 of 22,378 asset(s): 21,068 failed, 51 not searchable), and the command exits non-zero when operational failures exceed 10% of the assets. Failures are classified: an asset that cannot be searched in its current state (not indexed, no 3D data, indexing failed - reported by the API as a 409) is a property of the tenant and never fails the run, while authentication, network, and 5xx failures do. The check runs immediately after matching, so an incomplete run stops before spending minutes building a report that should not be trusted. Applies to folder geometric-match, folder part-match, and folder visual-match.