Skip to content

Release: merge development into beta - #1094

Merged
rubenvdlinde merged 692 commits into
betafrom
development
Aug 20, 2026
Merged

rubenvdlinde merged 692 commits into
betafrom
development

Conversation

@github-actions

Copy link
Copy Markdown
Contributor

Automated PR to sync development changes to beta for beta release.

Merging this PR will trigger the beta release workflow.

Reminder: Add a major, minor, or patch label to this PR to control the version bump. Default is patch.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ c95b354

Check PHP Vue Security License Tests
lint ✅
phpcs ❌
phpmd ❌
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ❌
stylelint ✅
composer ❌ ✅ 154/154
npm ✅ ❌ 1/621 denied
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

❌ Denied npm licenses

Package Version License
vue3-apexcharts 1.11.1 Custom: https://apexcharts.com/media/vue-apexcharts.png

Quality workflow — 2026-07-30 05:31 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 5a5a11e

Check PHP Vue Security License Tests
lint ❌
phpcs ❌
phpmd ❌
psalm ❌
phpstan ❌
phpmetrics ❌
eslint ❌
stylelint ❌
composer ❌ ❌
npm ❌ ❌
PHPUnit ❌
Newman ❌
Playwright ❌

Quality workflow — 2026-07-30 05:33 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 9b5e46f

Check PHP Vue Security License Tests
lint ✅
phpcs ❌
phpmd ❌
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ❌ ✅ 154/154
npm ✅ ❌ 1/621 denied
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

❌ Denied npm licenses

Package Version License
vue3-apexcharts 1.11.1 Custom: https://apexcharts.com/media/vue-apexcharts.png

Quality workflow — 2026-07-30 05:35 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ bf19c51

Check PHP Vue Security License Tests
lint ✅
phpcs ❌
phpmd ❌
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ❌ ✅ 154/154
npm ✅ ❌ 1/621 denied
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

❌ Denied npm licenses

Package Version License
vue3-apexcharts 1.11.1 Custom: https://apexcharts.com/media/vue-apexcharts.png

Quality workflow — 2026-07-30 07:50 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 366704f

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ❌
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ❌ 1/621 denied
PHPUnit ⏭️
Newman ⏭️
Playwright ❌

❌ Denied npm licenses

Package Version License
vue3-apexcharts 1.11.1 Custom: https://apexcharts.com/media/vue-apexcharts.png

Quality workflow — 2026-07-30 08:22 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 88eb758

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ❌
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ❌ 1/621 denied
PHPUnit ⏭️
Newman ⏭️
Playwright ❌

❌ Denied npm licenses

Package Version License
vue3-apexcharts 1.11.1 Custom: https://apexcharts.com/media/vue-apexcharts.png

Quality workflow — 2026-07-30 10:08 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 3c3a4d0

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ❌
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ❌ 1/621 denied
PHPUnit ⏭️
Newman ⏭️
Playwright ❌

❌ Denied npm licenses

Package Version License
vue3-apexcharts 1.11.1 Custom: https://apexcharts.com/media/vue-apexcharts.png

Quality workflow — 2026-07-30 19:19 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 4be32ad

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 621/621
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-07-30 19:25 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 1e67536

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 621/621
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-07-30 19:56 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 21f03ed

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 621/621
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-07-30 21:43 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 7c2356f

Check PHP Vue Security License Tests
lint ❌
phpcs ✅
phpmd ✅
psalm ✅
phpstan ❌
phpmetrics ❌
eslint ❌
stylelint ❌
composer ✅ ✅ 154/154
npm ❌ ❌
PHPUnit ❌
Newman ❌
Playwright ❌

Quality workflow — 2026-07-31 09:07 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ ebc57e0

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 621/621
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-07-31 09:28 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 0c753dd

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 621/621
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-07-31 09:59 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 8d61b41

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 618/618
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-07-31 10:04 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ b9e6846

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 699/699
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-07-31 14:06 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 162b7c8

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 699/699
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-08-01 13:33 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ e40d3e8

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 701/701
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-08-02 20:48 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 9812372

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 701/701
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-08-02 22:28 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 941b1b5

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 701/701
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-08-03 00:52 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ e58ff12

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 701/701
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-08-03 08:41 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 4821f3f

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 701/701
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-08-03 10:17 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ bd7ccc9

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 154/154
npm ✅ ✅ 701/701
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-08-03 14:35 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ efd04ea

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
composer ✅ ✅ 153/153
npm ✅ ✅ 701/701
PHPUnit ⏭️
Newman ❌
Playwright ❌

Quality workflow — 2026-08-03 16:51 UTC

Download the full PDF report from the workflow artifacts.

docs(benchmark): task 2.2 legacy baseline measured; decomposed side blocked; two legacy defects found
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ ab0a38c

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ✅
Newman ✅
Playwright ✅
Hydra gates ✅

Quality workflow — 2026-08-20 03:50 UTC

Download the full PDF report from the workflow artifacts.

…oposal

docs(openspec): propose ori-public-serving — openconnector serves ORI 1.4 for decidesk
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 63c6cdd

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ✅
Newman ✅
Playwright ✅
Hydra gates ✅

Quality workflow — 2026-08-20 05:06 UTC

Download the full PDF report from the workflow artifacts.

juanclaude-conduction and others added 4 commits August 20, 2026 07:13
…oken

v1.8.0 shipped an ObjectServiceInterface WITHOUT patchObject() and with
updateObject() still summarised as "Apply a partial update" — the wording
that sent a consumer down the erasing path. The correction landed on main
two days after the tag; every app has been pinned to the broken copy since.

hydra-gates claims OCA\OpenRegister\Contract\ in its composer autoload, a
LONGER psr-4 prefix than openregister's own OCA\OpenRegister\ -> lib/, so the
gate package wins. Nine repos vendor it, so whichever app registers first
defines the contract for the whole instance — measured, softwarecatalog's
vendor was supplying openregister's interface, and updating openregister
alone did not change the winner.

Lockfile only; the ^1.0 constraint already allowed this. Resolved with
--ignore-platform-reqs because this box lacks ext-soap/bcmath/intl; the diff
is six lines (version, two references, content-hash) and touches no other
package and no platform block.
chore(deps): take hydra-gates v1.8.1 — the contract v1.8.0 shipped broken
…s identity

Two measured defects in the legacy engine, found while establishing the task-2.2
benchmark baseline. They compound: D1 sends every object of a mapped
synchronization down the update path, D2 mints a fresh contract for each.

D1 — a synchronization WITH a mapping could never skip. The clause read
`$mapping->getUpdated() < $contract['sourceLastChecked']`, comparing a DateTime
against an ATOM string. PHP does not order an object against a string, so it was
false whenever the mapping had a timestamp. Measured on the 2000-dataset CKAN
benchmark with identical source data: 1854 skipped unmapped, 0 skipped mapped,
6.8 s against 17.7 s. Both sides are now normalised to a Unix timestamp.

The two unknowns fall in DIFFERENT directions, and that is the whole subtlety:
an absent mapping timestamp is not evidence the mapping changed, so it must not
block the skip (`null < 'somestring'` was true before, and that behaviour is
kept); an absent `sourceLastChecked` means there is no previous check to be
newer than, so the run must write. A first cut treated every unknown as "cannot
prove it is older" and broke EndoflifeDateSyncTest::testRepeatedSyncIsIdempotent,
taking `skipped` from 2 to 0 — re-introducing the same defect from the other
side. That case is now pinned by a test.

D2 — every update minted a NEW contract. persist() read `$object['uuid']` alone
and then dropped `$object['id']`, on the reasoning that `id` was a legacy int. A
contract payload carries no `uuid` property at all: its identity comes back from
OpenRegister AS `id`, and that `id` is a uuid string. So the upsert key was
always null and every save created. Measured: four DISTINCT contract objects for
one (synchronizationId, originId), one per run, each carrying an IDENTICAL
originHash — the source demonstrably had not changed. The dev instance holds
528,656 contract rows. Identity is now read BEFORE `id` is dropped; a numeric
`id` is still refused, which is what the original comment was protecting against.

Specs: synchronization-engine REQ-024 and REQ-025.

Verified: 14 new tests; the D1 control confirms `new DateTime(...) < '<atom>'` is
false for values 28 s apart, and the D2 control is the same test failing against
the unfixed code with "Failed asserting that null matches expected
'2ad6c9a4-...'". Full unit suite 2586 tests — 27 errors / 1 failure with the fix
against 40 / 2 without it, and every remaining one is a pre-existing local stub
artefact in a class this change does not touch (CI's PHPUnit is green on
development). phpcs 0 errors and no warning delta on lib, phpstan and psalm
clean, gate-16 and gate-46 clean at the origin/beta merge scope, openspec 85/85.
…-identity

fix(sync): a mapped synchronization can skip again, and a contract upserts on its own identity
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ f68c020

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ❌
Newman ❌
Playwright ❌
Hydra gates ❌

Quality workflow — 2026-08-20 05:47 UTC

Download the full PDF report from the workflow artifacts.

@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ c3e5fbc

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ✅
Newman ✅
Playwright ✅
Hydra gates ❌

Quality workflow — 2026-08-20 06:24 UTC

Download the full PDF report from the workflow artifacts.

rubenvdlinde and others added 2 commits August 20, 2026 10:23
…eady has

Live verification of #1306 showed the contract fix was only half done. On the
2000-dataset CKAN benchmark the skip came back exactly as intended — 0 skipped
before, 1903 of 2000 after — but a run that skipped 1903 and updated 97 STILL
added exactly 97 contract rows. Growth had dropped from +2000 to +97 per run
because far fewer objects took the update path, not because the update path
stopped duplicating.

`ensureUuid` is meant to mint an identity for a contract that HAS none. It
tested `empty($object['uuid'])`, which is true for every contract ever loaded
back from OpenRegister — they carry `id`, never `uuid`. So it minted a fresh
uuid ON TOP of a perfectly good identity, and the save created instead of
updating. Both persists at the end of synchronizeContract pass
`ensureUuid: true`, so this was every single update.

The identity is now read first and `ensureUuid` only fills a genuine gap.

Also adds the @SPEC anchor gate-16 wants on updateFromArray, whose body changed
in #1306.

Verified: 2 new tests. The control is the same test against the old ordering,
which fails on the minted uuid rather than the contract's own id; a second test
pins that ensureUuid STILL mints when there is genuinely no identity, so the
fix cannot regress into passing null and creating an unkeyed row. Unit suite
2588 tests at the unchanged pre-existing baseline of 27 errors / 1 failure,
phpcs 0 errors (19 -> 18 warnings), phpstan clean, gate-16 1 -> 0 and gate-46
clean at the origin/beta merge scope, openspec 85/85.
…verrides-identity

fix(sync): ensureUuid must not mint over an identity the contract already has
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 30b43e9

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ✅
Newman ✅
Playwright ✅
Hydra gates ✅

Quality workflow — 2026-08-20 09:20 UTC

Download the full PDF report from the workflow artifacts.

rubenvdlinde and others added 6 commits August 20, 2026 11:39
The coverage ratchet failed #1307 on its own diff: the two statements the fix
adds live in BOTH copies of the logic — the delegate in
SynchronizationContractService and the local copy in SynchronizationService that
runs when no delegate is wired — and only the delegate was covered.

    Changed files, base: 2222/4026 -> head: 2223/4028

This is not coverage bought with filler. The fallback carried exactly the same
defect and is a real path; leaving it untested is how the two copies drift.
Covers both directions there: `ensureUuid: true` must not mint over an `id` the
contract already has, and must still mint when there is genuinely none.
I reported the contract duplication fixed twice and it was not. This is the
path the engine actually takes, and I had explicitly decided NOT to touch it.

When a target write is buffered, synchronizeContract() pushes the contract onto
`contractWriteBuffer` and the flush writes the batch through persistBulk() —
persistContract() is never called for those rows. So neither #1306 nor #1307
reached the rows this synchronization actually writes.

persistBulk() carried the identical defect: it tested `empty($object['uuid'])`,
true for every contract loaded back from OpenRegister (they carry `id`, never
`uuid`), minted a fresh uuid and overwrote `id` with it, so the batch created a
duplicate instead of updating.

Measured live after #1307 deployed, twice in a row, well past the 60s opcache
window: a run that skipped 1903 of 2000 and updated 97 still added exactly 97
contract rows (8237 -> 8334 -> 8431). What identified this path was the shape of
the rows it added — no `uuid` property and no `version` — which rules out both
createFromArray(), that always stamps a version, and an ensureUuid mint, that
always stores a uuid.

WHY I MISSED IT. I saw persistBulk had the same shape and left it, reasoning
that ContractCommitNode refuses to commit an update without a contract uuid so
the path was guarded. That guard is real, but it protects the FLOW engine. The
LEGACY buffered path calls persistBulk directly, with contracts that carry no
uuid. "Guarded by a caller I checked" was not the same as "guarded by every
caller".

Verified: 3 new tests, with the control being the same tests against the
reverted method, which fail on the minted uuid rather than the contract's own
id. One test pins that persistBulk still mints when there genuinely is no
identity, and one that a numeric id is still refused. Unit suite 2591 tests at
the unchanged pre-existing baseline of 27 errors / 1 failure, phpcs 0 errors,
phpstan clean, gate-16 and gate-46 clean at the origin/beta merge scope.
…ty defect

Found by sweeping every contract-writing site instead of reasoning about which
ones matter — the habit that would have caught persistBulk two attempts ago.

`SynchronizationService::updateContractFromArray()` dropped `id` BEFORE reading
`uuid`, so it upserted on null exactly like the others. Its delegate twin was
corrected in #1306; this copy was missed.

It only runs when no SynchronizationContractService is wired, so it is not the
live path — but it is the same latent defect, and leaving one copy behind is how
the two drift apart again.

The sweep now accounts for every writer: persist(), persistBulk(),
updateFromArray() and persistContract() derive the upsert key from
contractIdentity(); createFromArray() and createContractFromArray() mint
deliberately, because they exist to create.
…back-coverage

test(sync): cover the fallback persistContract() ensureUuid branch
Two user-visible defects are fixed by this bump.

TWO AI-COMPANION HEXES ON EVERY PAGE. The companion singleton landed in
2.7.0. Below that the host app's own companion never stands down, so any
page of this app rendered a second hex 8px from hermiq's — measured on a
running instance: openconnector (2.7.1) showed ONE, openbuild (2.6.3)
showed TWO, both visible at 52x60, from two separate mounts.

THE DETAIL PAGE RECLOSED ITS SIDEBAR WHILE HYDRATING. CnDetailPage set
sidebarSeeded and never read it, so 'open' was re-applied on every sync
and each reactive change during hydration reset it to the prop default.
Fixed in nextcloud-vue#711; that is the cause behind openbuild#268 and,
on the evidence, #188.

Lockfile only — the existing caret already allowed this. Three-line diff
(version, resolved, integrity).
…identity

fix(sync): persistBulk must upsert on the contract's own identity too
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 83c6d7e

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ✅
Newman ✅
Playwright ✅
Hydra gates ✅

Quality workflow — 2026-08-20 11:06 UTC

Download the full PDF report from the workflow artifacts.

rubenvdlinde and others added 2 commits August 20, 2026 13:10
chore(deps): take @conduction/nextcloud-vue 2.8.2 (was 2.8.0)
This is where the duplicate-per-rerun defect actually lived. Three previous
fixes corrected the writers and changed nothing measurable, because the identity
was already gone before any writer ran.

Both sites in synchronizeContract() read:

    if (($synchronizationContract['uuid'] ?? null) === null) {
        $synchronizationContract['uuid'] = (string)Uuid::v4();
    }

A contract loaded back from OpenRegister carries `id`, never `uuid`. So that
test was true on EVERY rerun: a fresh identity minted each time, and every
downstream writer — persist(), persistContract(), persistBulk() — then faithfully
upserted on that brand-new uuid and created a row. The writers were doing exactly
what they were told.

Measured across three successive live runs on the 2000-dataset CKAN clone, each
one skipping 1903 of 2000 and updating 97, each one adding exactly 97 contracts:
8237 -> 8334 -> 8431 -> 8528. The count moved identically before and after the
writer fixes, which is what finally pointed upstream of them.

`assignContractIdentity()` now derives the write identity through
contractIdentity() — `uuid`, else a non-numeric `id` — and mints only when there
is genuinely neither, which is what these two sites were for.

The writer fixes are not wasted: they are what makes this one sufficient rather
than merely necessary. Each of the four paths now derives identity the same way,
so none can reintroduce the mint on its own.

Verified: 4 new tests covering all four directions (existing id adopted, explicit
uuid preserved, no identity still minted, numeric id replaced not adopted). Unit
suite 2597 tests at the unchanged pre-existing baseline of 27 errors / 1 failure,
phpcs 0 errors, phpstan clean, gate-16 and gate-46 clean at the origin/beta merge
scope. The live re-measurement follows the merge; the number to beat is +0.
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 9e41447

Check PHP Vue Security License Tests
lint ⏭️
phpcs ⏭️
phpmd ⏭️
psalm ⏭️
phpstan ⏭️
phpmetrics ⏭️
eslint ⏭️
stylelint ⏭️
build ⏭️
composer ⏭️ ⏭️
npm ⏭️ ⏭️
app:check-code ⏭️
info.xml ⏭️
REUSE ⏭️
PHPUnit ❌
Newman ❌
Playwright ❌
Hydra gates ❌

Quality workflow — 2026-08-20 11:20 UTC

Download the full PDF report from the workflow artifacts.

…royed-upstream

fix(sync): stop destroying the contract's identity before it is written
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 54d436f

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ✅
Newman ✅
Playwright ❌
Hydra gates ❌

Quality workflow — 2026-08-20 12:00 UTC

Download the full PDF report from the workflow artifacts.

…now stale

D2 took four attempts and the first three fixed the wrong layer. Recording both
the result and the misread, because the misread is the reusable part.

THE RESULT. Contract delta 0 across five consecutive runs, and — the check that
actually decides it — an existing contract row proven updated IN PLACE. Probe
origin 86bee4b2 had accumulated 9 contracts, one per run; after the fix the count
stayed at 9 and the OLDEST row moved from 02:29:34 to 11:59:34 with targetHash
intact. A flat total alone is necessary but not sufficient: it reads identically
whether the row was updated or nothing was written at all.

The corpus now skips 2000/2000. The 97 that used to update forever were only
doing so because their contract was re-created every run, so the hash comparison
could never hold for them.

THE MISREAD. Each of the first three fixes provably landed — verified in the
container, not the checkout — and the count still went 8237 -> 8334 -> 8431 ->
8528, exactly +1 per updated object every time. I read that as "there is one more
writer to find" and went looking for a fourth. It meant the cause was upstream of
every writer: synchronizeContract() minted a fresh uuid before any of them ran.
A fix that lands and moves nothing is evidence about the LAYER, not the site.

TIMINGS ARE NOT CARRIED FORWARD. The old bar (6.8 s unmapped / 17.7 s mapped /
22.6 s decomposed) described an engine that rewrote 2000 objects a run, which it
no longer does, so it cannot be the bar the decomposed flow must beat. The
verification runs cannot supply the replacement either: loadavg 15.98 with
nextcloud at 88.7% CPU, against 0.36 for the original baseline. Their 30-77 s is
contention, not engine. All three figures need re-taking together on a quiet box,
and 2.2 stays open until they are.
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 01e687e

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ✅
Newman ✅
Playwright ✅
Hydra gates ✅

Quality workflow — 2026-08-20 12:38 UTC

Download the full PDF report from the workflow artifacts.

docs(benchmark): D1 and D2 verified live; every wall-clock figure is now stale
@github-actions

Copy link
Copy Markdown
Contributor Author

Quality Report — ConductionNL/openconnector @ 3d65236

Check PHP Vue Security License Tests
lint ✅
phpcs ✅
phpmd ✅
psalm ✅
phpstan ✅
phpmetrics ✅
eslint ✅
stylelint ✅
build ✅
build ✅
check-specs ✅
test-l10n ✅
format ✅
composer ✅ ✅ 145/145
npm ✅ ✅ 534/534
app:check-code ⏭️
info.xml ✅
REUSE ❌
PHPUnit ✅
Newman ✅
Playwright ✅
Hydra gates ✅

Quality workflow — 2026-08-20 13:23 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde
rubenvdlinde merged commit 864595a into beta Aug 20, 2026
87 of 88 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants