Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
311 commits
Select commit Hold shift + click to select a range
74bd9a0
Merge branch 'build/d179-form-destination-validator' into build/d180-…
rubenvdlinde Oct 10, 2026
118b56a
refactor(objects): phpmd: draft move and write-or-promote in their ow…
rubenvdlinde Oct 10, 2026
fb3a024
fix(forms): a draft is written only by its owner, checked explicitly …
rubenvdlinde Oct 10, 2026
5cac086
fix(forms): psalm, phpstan and the lookup audit rule; one destination…
rubenvdlinde Oct 10, 2026
c4c7311
Merge remote-tracking branch 'origin/development' into build/d179-for…
rubenvdlinde Oct 10, 2026
e1ab4e2
Merge build/d179-form-destination-validator into build/d180-draft-lif…
rubenvdlinde Oct 10, 2026
4339dbe
fix(objects): psalm on draftData; the aggregation fixture table carri…
rubenvdlinde Oct 10, 2026
f3a6342
style(forms): prettier on the e2e spec
rubenvdlinde Oct 10, 2026
a820830
style(objects): prettier on the e2e spec
rubenvdlinde Oct 10, 2026
ff7b169
fix(objects): the e2e spec without the merge markers a82083009e carri…
rubenvdlinde Oct 10, 2026
73b661b
feat(calculations): graduated and bandRate operators sum a quantity o…
rubenvdlinde Oct 10, 2026
869421d
feat(tasks): a portal task may name the app action that completes it
rubenvdlinde Oct 10, 2026
b2091d9
feat(referential-integrity): onDelete RESTRICT for a reference by key…
rubenvdlinde Oct 10, 2026
7e1782d
feat(dmn): named decision tables are stored once and flows reference …
rubenvdlinde Oct 10, 2026
09a8313
Merge remote-tracking branch 'origin/development' into shep/4541
rubenvdlinde Oct 11, 2026
0341d8f
Merge remote-tracking branch 'origin/development' into shep/4544
rubenvdlinde Oct 11, 2026
cdecc14
Merge remote-tracking branch 'origin/development' into shep/4546
rubenvdlinde Oct 11, 2026
ae39acf
Merge remote-tracking branch 'origin/development' into shep/4547
rubenvdlinde Oct 11, 2026
bf9e3a2
Merge remote-tracking branch 'origin/development' into shep/4549
rubenvdlinde Oct 11, 2026
279dbfc
Merge remote-tracking branch 'origin/development' into shep/4553
rubenvdlinde Oct 11, 2026
0e56e51
Merge remote-tracking branch 'origin/development' into shep/4555
rubenvdlinde Oct 11, 2026
35744f1
Merge remote-tracking branch 'origin/development' into shep/4559
rubenvdlinde Oct 11, 2026
b56f336
Merge remote-tracking branch 'origin/development' into shep/4563
rubenvdlinde Oct 11, 2026
2c58a31
Merge remote-tracking branch 'origin/development' into shep/4569
rubenvdlinde Oct 11, 2026
fdb9328
Merge remote-tracking branch 'origin/development' into shep/4570
rubenvdlinde Oct 11, 2026
5d6d194
Merge remote-tracking branch 'origin/development' into shep/4571
rubenvdlinde Oct 11, 2026
8004458
Merge remote-tracking branch 'origin/development' into shep/4572
rubenvdlinde Oct 11, 2026
f7211fa
Merge remote-tracking branch 'origin/development' into shep/4534
rubenvdlinde Oct 11, 2026
acd1872
fix(ci): clear development's red after #4573 (prettier on the folder-…
rubenvdlinde Oct 11, 2026
edbf91c
Merge branch 'shep/fix-dev-red' into shep/4541
rubenvdlinde Oct 11, 2026
7eb39f7
Merge branch 'shep/fix-dev-red' into shep/4544
rubenvdlinde Oct 11, 2026
396236f
Merge branch 'shep/fix-dev-red' into shep/4546
rubenvdlinde Oct 11, 2026
00ebabd
Merge branch 'shep/fix-dev-red' into shep/4547
rubenvdlinde Oct 11, 2026
f6c0e50
Merge branch 'shep/fix-dev-red' into shep/4549
rubenvdlinde Oct 11, 2026
c1b14aa
Merge branch 'shep/fix-dev-red' into shep/4553
rubenvdlinde Oct 11, 2026
e942e0f
Merge branch 'shep/fix-dev-red' into shep/4555
rubenvdlinde Oct 11, 2026
9c128bd
Merge branch 'shep/fix-dev-red' into shep/4559
rubenvdlinde Oct 11, 2026
bd74018
Merge branch 'shep/fix-dev-red' into shep/4563
rubenvdlinde Oct 11, 2026
ba38d20
Merge branch 'shep/fix-dev-red' into shep/4569
rubenvdlinde Oct 11, 2026
3a65136
Merge branch 'shep/fix-dev-red' into shep/4570
rubenvdlinde Oct 11, 2026
7751836
Merge branch 'shep/fix-dev-red' into shep/4571
rubenvdlinde Oct 11, 2026
5aeea78
Merge branch 'shep/fix-dev-red' into shep/4572
rubenvdlinde Oct 11, 2026
0991b62
Merge branch 'shep/fix-dev-red' into shep/4534
rubenvdlinde Oct 11, 2026
ee58aca
Merge branch 'shep/4544' into shep/4545
rubenvdlinde Oct 11, 2026
68f923f
Merge branch 'shep/4546' into shep/4554
rubenvdlinde Oct 11, 2026
baebc40
Merge branch 'shep/4563' into shep/4566
rubenvdlinde Oct 11, 2026
359f5c3
fix(ci): catalogue keys for the decision table register's schema strings
rubenvdlinde Oct 11, 2026
653ad8e
fix(ci): McpTool's tenth field trips ExcessiveParameterList; suppress…
rubenvdlinde Oct 11, 2026
94211c6
fix(ci): translate the decision table register's schema strings into …
rubenvdlinde Oct 11, 2026
ce3a58e
fix(ci): mark the decision table schema as holding no demo data (gate…
rubenvdlinde Oct 11, 2026
b388178
fix(ci): put @spec after @return so phpcs accepts the docblock order
rubenvdlinde Oct 11, 2026
82bf316
Merge branch 'shep/fix-dev-red' into shep/4541
rubenvdlinde Oct 11, 2026
7d2e068
Merge branch 'shep/fix-dev-red' into shep/4544
rubenvdlinde Oct 11, 2026
78a38cb
Merge branch 'shep/fix-dev-red' into shep/4546
rubenvdlinde Oct 11, 2026
7f570b7
Merge branch 'shep/fix-dev-red' into shep/4547
rubenvdlinde Oct 11, 2026
287ee9a
Merge branch 'shep/fix-dev-red' into shep/4549
rubenvdlinde Oct 11, 2026
83bb535
Merge branch 'shep/fix-dev-red' into shep/4553
rubenvdlinde Oct 11, 2026
385ff84
Merge branch 'shep/fix-dev-red' into shep/4555
rubenvdlinde Oct 11, 2026
4352e4f
Merge branch 'shep/fix-dev-red' into shep/4559
rubenvdlinde Oct 11, 2026
3012a81
Merge branch 'shep/fix-dev-red' into shep/4563
rubenvdlinde Oct 11, 2026
0e7cfbd
Merge branch 'shep/fix-dev-red' into shep/4569
rubenvdlinde Oct 11, 2026
162f1c8
Merge branch 'shep/fix-dev-red' into shep/4570
rubenvdlinde Oct 11, 2026
cb04648
Merge branch 'shep/fix-dev-red' into shep/4571
rubenvdlinde Oct 11, 2026
886fd02
Merge branch 'shep/fix-dev-red' into shep/4572
rubenvdlinde Oct 11, 2026
4e25fd9
Merge branch 'shep/fix-dev-red' into shep/4534
rubenvdlinde Oct 11, 2026
481c495
Merge branch 'shep/fix-dev-red' into shep/4545
rubenvdlinde Oct 11, 2026
bc64d9c
Merge branch 'shep/4544' into shep/4545
rubenvdlinde Oct 11, 2026
20299fe
Merge branch 'shep/fix-dev-red' into shep/4554
rubenvdlinde Oct 11, 2026
2c25f90
Merge branch 'shep/4546' into shep/4554
rubenvdlinde Oct 11, 2026
da1cbe0
Merge branch 'shep/fix-dev-red' into shep/4566
rubenvdlinde Oct 11, 2026
76b1e43
Merge branch 'shep/4563' into shep/4566
rubenvdlinde Oct 11, 2026
7779ea6
fix(ci): declare the classes the new tests execute (@uses) so they re…
rubenvdlinde Oct 11, 2026
1a70c1c
fix(ci): declare the class CasePlanServiceTest executes (@uses)
rubenvdlinde Oct 11, 2026
27a0524
fix(ci): declare the classes the new tests execute (@uses) so they re…
rubenvdlinde Oct 11, 2026
874efca
fix(ci): declare the classes the new tests execute (@uses) so they re…
rubenvdlinde Oct 11, 2026
dff8b84
Merge branch 'shep/4544' into shep/4545
rubenvdlinde Oct 11, 2026
056a12b
Merge branch 'shep/4563' into shep/4566
rubenvdlinde Oct 11, 2026
6051cb1
fix(ci): declare the classes the new tests execute (@uses) so they re…
rubenvdlinde Oct 11, 2026
12d6351
fix(ci): cover the listener's fail-open branches and the refusal reas…
rubenvdlinde Oct 11, 2026
6f45809
feat(records): a user saves and shares a named record template
rubenvdlinde Oct 11, 2026
ace286d
chore(sync): carry beta back into development
github-actions[bot] Oct 11, 2026
1207325
Merge pull request #4578 from ConductionNL/sync/beta-to-development-2…
rubenvdlinde Oct 11, 2026
148261e
chore(openspec): records-saved-templates 1.1 and 1.2 built, live chec…
rubenvdlinde Oct 11, 2026
8cd2e84
Merge pull request #4575 from ConductionNL/fix/ci-dev-red-4573
rubenvdlinde Oct 11, 2026
7abf765
Merge pull request #4541 from ConductionNL/build/dep-dossiq-task-sign…
rubenvdlinde Oct 11, 2026
9903e23
Merge pull request #4546 from ConductionNL/build/dep-dossiq-mcptool-r…
rubenvdlinde Oct 11, 2026
e8fd59a
Merge pull request #4554 from ConductionNL/build/dep-dossiq-mcptool-a…
rubenvdlinde Oct 11, 2026
82564d7
Merge pull request #4547 from ConductionNL/build/dep-dossiq-registry-…
rubenvdlinde Oct 11, 2026
a5c69f9
Merge pull request #4549 from ConductionNL/build/dep-dossiq-file-writ…
rubenvdlinde Oct 11, 2026
658dc20
Merge pull request #4553 from ConductionNL/build/dep-dossiq-run-node-…
rubenvdlinde Oct 11, 2026
6d364b0
Merge pull request #4555 from ConductionNL/build/dep-dossiq-search-de…
rubenvdlinde Oct 11, 2026
4cf9e43
Merge pull request #4559 from ConductionNL/build/dep-dossiq-email-rec…
rubenvdlinde Oct 11, 2026
c931f02
Merge pull request #4569 from ConductionNL/build/dep-portal-task-comp…
rubenvdlinde Oct 11, 2026
7dae37c
Merge pull request #4570 from ConductionNL/refactor/r5-reference-guar…
rubenvdlinde Oct 11, 2026
1e24c79
Merge pull request #4571 from ConductionNL/feat/graduated-rate-calcul…
rubenvdlinde Oct 11, 2026
f93992c
Merge pull request #4544 from ConductionNL/build/cmmn-runtime-1
rubenvdlinde Oct 11, 2026
a1d52b6
Merge pull request #4563 from ConductionNL/build/d179-form-destinatio…
rubenvdlinde Oct 11, 2026
46038ad
Merge origin/development into build/openspecs-2
rubenvdlinde Oct 11, 2026
1e28dae
Merge origin/build/openspecs-2 into build/openspecs-3
rubenvdlinde Oct 11, 2026
89ac39d
Merge remote-tracking branch 'origin/development' into shep/4545
rubenvdlinde Oct 11, 2026
97aa75d
Merge origin/development into build/d180-draft-lifecycle
rubenvdlinde Oct 11, 2026
e75dbbe
Merge origin/development into build/dep-dossiq-record-templates
rubenvdlinde Oct 11, 2026
ab3692e
feat(decisions): a decision is its own object, and a schema declares …
rubenvdlinde Oct 11, 2026
10a2d83
feat(decisions): only the decider, a supervisor or an administrator c…
rubenvdlinde Oct 11, 2026
7fb399e
chore(openspec): reviewer-owns-their-decisions follows decision 197
rubenvdlinde Oct 11, 2026
21076e8
feat(objects): a draft may be owned by a scope value such as portal:<…
rubenvdlinde Oct 11, 2026
6a89b48
fix(dmn): validate only rows in the decision-tables register; test th…
rubenvdlinde Oct 11, 2026
60abb4e
chore(decisions): the entity relation PATCH names its requirement
rubenvdlinde Oct 11, 2026
5752019
fix(schemas): accept the hideOnCreate form role and publish inputCont…
rubenvdlinde Oct 11, 2026
575105f
fix(rbac): a roles block that resolves to nothing grants nothing (#4589)
rubenvdlinde Oct 11, 2026
f05db03
fix(settings): personal settings move into the user settings dialog (…
rubenvdlinde Oct 11, 2026
90a3c00
feat(objects): the owner of a draft can discard it (decision 195)
rubenvdlinde Oct 11, 2026
23574ae
fix(ci): cover the plan-item timer, node and expiry paths the coverag…
rubenvdlinde Oct 11, 2026
857328b
fix(ci): move the app version so the added migration runs on upgrade
rubenvdlinde Oct 11, 2026
5e46dc0
Merge remote-tracking branch 'origin/build/openspecs-2' into shep/4534
rubenvdlinde Oct 11, 2026
4ba2c11
fix(ci): cover the blocker guard, mapper, release listener and export…
rubenvdlinde Oct 11, 2026
5c91a9f
Merge origin/development into build/dep-portaliq-portal-draft-owner
rubenvdlinde Oct 11, 2026
0582b01
Merge origin/development into feat/stored-decision-tables
rubenvdlinde Oct 11, 2026
7eb0ee9
feat(decisions): another reviewer's decision is hidden under hideOthers
rubenvdlinde Oct 11, 2026
c40c3ab
fix(decisions): under hideOthers a refused change names neither who d…
rubenvdlinde Oct 11, 2026
6394323
Merge branch 'build/dep-dossiq-decision-objects' into build/dep-dossi…
rubenvdlinde Oct 11, 2026
9f66c24
feat(decisions): the app that owns the subject may show a hidden deci…
rubenvdlinde Oct 11, 2026
91146be
Merge pull request #4566 from ConductionNL/build/d180-draft-lifecycle
rubenvdlinde Oct 12, 2026
a27b82b
Merge PR #4545 (build/cmmn-runtime-2) into train
rubenvdlinde Oct 12, 2026
abb7c7d
Merge PR #4526 (build/openspecs-2) into train
rubenvdlinde Oct 12, 2026
1d23d89
Merge PR #4534 (build/openspecs-3) into train
rubenvdlinde Oct 12, 2026
1ac1966
Merge PR #4579 into train
rubenvdlinde Oct 12, 2026
79d0253
Merge PR #4583 into train
rubenvdlinde Oct 12, 2026
6fb970f
Merge PR #4592 (build/dep-dossiq-decision-hiding) into train
rubenvdlinde Oct 12, 2026
4f20772
Merge PR #4584 into train
rubenvdlinde Oct 12, 2026
849db39
Merge PR #4591 (build/dep-portaliq-draft-discard) into train
rubenvdlinde Oct 12, 2026
58a2f16
Merge PR #4572 into train
rubenvdlinde Oct 12, 2026
daed30c
chore(train): bump info.xml version so every new migration and repair…
rubenvdlinde Oct 12, 2026
2eb8d3f
fix(forms): a portal subject's first draft save no longer answers 403…
rubenvdlinde Oct 12, 2026
c716f9f
feat(objects): lists and searches hide drafts unless asked, the calle…
rubenvdlinde Oct 12, 2026
a9279e5
style: prettier on App.vue, BrowserNotificationsSection.vue, UserSett…
rubenvdlinde Oct 12, 2026
ffe6804
Merge PR #4594 (build/dep-portaliq-draft-rbac-and-list) into train
rubenvdlinde Oct 12, 2026
e258472
Merge pull request #4595 from ConductionNL/train/2026-10-12-a
rubenvdlinde Oct 12, 2026
c021ddb
chore(gates): procedure-code baseline for gate 119 (decision 188) (#4…
rubenvdlinde Oct 12, 2026
899a44c
feat(objects): a draft's owner makes it definitive, and a schema sets…
rubenvdlinde Oct 12, 2026
b6bef47
feat(objects): the draft activation over HTTP, the OpenSpec change an…
rubenvdlinde Oct 12, 2026
7a7f761
style(objects): keep the draft activation within the line limit
rubenvdlinde Oct 12, 2026
88e2d64
feat(objects): a draft can be deleted on an archival schema, and its …
rubenvdlinde Oct 12, 2026
6c66bb3
feat(notifications): a draft notifies nobody, leaving draft is its cr…
rubenvdlinde Oct 12, 2026
f5b2b44
feat(objects): a schema keeps the caller's own drafts out of its list…
rubenvdlinde Oct 12, 2026
c08d278
fix(objects): the controller hands the user in and no owner; the draf…
rubenvdlinde Oct 12, 2026
3733fdd
feat(objects): a draft expires after 30 days by default, and a remove…
rubenvdlinde Oct 12, 2026
1940b7a
feat(events): creation side effects wait until a draft leaves draft, …
rubenvdlinde Oct 12, 2026
832ce81
refactor(objects): the draft cleanup job names itself for the audit t…
rubenvdlinde Oct 12, 2026
dca747e
Merge branch 'feat/draft-owner-activate-and-lifetime' into feat/draft…
rubenvdlinde Oct 12, 2026
e784371
feat(migration-packs): accept definition envelope, lock built-in slug…
WilcoLouwerse Oct 12, 2026
fcb3fcf
feat(migration-packs): list and edit migration packs in OpenRegister
WilcoLouwerse Oct 12, 2026
e79b81f
docs(openspec): add the migration-pack-editor-ui change
WilcoLouwerse Oct 12, 2026
15f0dea
style(objects): keep the job's suppression note within the line limit
rubenvdlinde Oct 12, 2026
8a3c2f6
Merge branch 'feat/draft-owner-activate-and-lifetime' into feat/draft…
rubenvdlinde Oct 12, 2026
82e6c27
fix(migration-packs): log create and import, keep the slug lock after…
WilcoLouwerse Oct 12, 2026
581b23a
fix(l10n): append the migration-pack strings instead of rewriting en.…
WilcoLouwerse Oct 12, 2026
6ef6271
fix(migration-packs): sample rows for JSON packs, cleared date format…
WilcoLouwerse Oct 12, 2026
c0d1136
test(objects): read appinfo/info.xml as a string, a loaded Nextcloud …
rubenvdlinde Oct 12, 2026
3e4a0ce
refactor(migration-packs): move the delete and transform dialogs into…
WilcoLouwerse Oct 12, 2026
7661a90
fix(l10n): add the migration-pack manifest titles to nl.json
WilcoLouwerse Oct 12, 2026
6233a1b
test(e2e): drive the migration pack list and editor in the browser
WilcoLouwerse Oct 12, 2026
185f58d
docs(migration-packs): say why both pages stay custom, and point task…
WilcoLouwerse Oct 12, 2026
99c6e4b
fix(l10n): translate the migration-pack strings into every locale
WilcoLouwerse Oct 12, 2026
d572189
test(objects): the draft activation collection runs each step as the …
rubenvdlinde Oct 12, 2026
498da77
fix(objects): a stored null is a property nobody filled in when a dra…
rubenvdlinde Oct 12, 2026
853d562
fix(objects): a save cannot write over a draft its caller cannot read
rubenvdlinde Oct 12, 2026
cabae91
test(objects): the draft tests name every class they execute
rubenvdlinde Oct 12, 2026
5e4d4d2
Merge branch 'feat/draft-owner-activate-and-lifetime' into feat/draft…
rubenvdlinde Oct 12, 2026
b55b1df
feat(objects): a generated identifier waits until the object leaves d…
rubenvdlinde Oct 12, 2026
e5d8799
fix(migration-packs): one error envelope without exception text, spli…
WilcoLouwerse Oct 12, 2026
c76eec7
fix(migration-packs): guard unsaved edits, read the error codes, make…
WilcoLouwerse Oct 12, 2026
350e6b7
docs(openspec): make the migration-pack change valid and anchor every…
WilcoLouwerse Oct 12, 2026
bcce09a
fix(l10n): english and dutch for the review fixes
WilcoLouwerse Oct 12, 2026
3779237
fix(l10n): translate the review-fix strings into every locale
WilcoLouwerse Oct 12, 2026
6d614a3
fix(migration-packs): answer a taken slug with its own code (pre-push…
WilcoLouwerse Oct 12, 2026
b3844cc
fix(migration-packs): do not read a 412 as someone else's save (pre-p…
WilcoLouwerse Oct 12, 2026
98da1eb
test(e2e): say when the migration-pack run uses a non-English account…
WilcoLouwerse Oct 12, 2026
27bc051
fix(migration-packs): refuse an update based on an older read on the …
WilcoLouwerse Oct 12, 2026
6c266e3
docs(migration-packs): state the 1 MiB bound of a preview request (pr…
WilcoLouwerse Oct 12, 2026
6cb5659
fix(migration-packs): let a yes/no table keep a stored 1 or 0 (pre-pu…
WilcoLouwerse Oct 12, 2026
609444b
docs(openspec): tick the error-shape tasks and say why the e2e run fa…
WilcoLouwerse Oct 12, 2026
7366876
test(migration-packs): check template bindings on mounted components …
WilcoLouwerse Oct 12, 2026
4dc5dba
fix(l10n): english and dutch for the taken-slug text (pre-push check …
WilcoLouwerse Oct 12, 2026
af0e007
fix(l10n): translate the taken-slug text into every locale (pre-push …
WilcoLouwerse Oct 12, 2026
93269f9
refactor(migration-packs): take the read update time as a Unix time i…
WilcoLouwerse Oct 12, 2026
c775d20
style(tests): prettier on the migration-pack specs
WilcoLouwerse Oct 13, 2026
1c54568
fix(migration-packs): give the defaults table its own field label
WilcoLouwerse Oct 13, 2026
8ef92f0
test(e2e): match the migration-pack editor's row labels exactly
WilcoLouwerse Oct 13, 2026
7321876
docs(openspec): record the passing Playwright run of the migration-pa…
WilcoLouwerse Oct 13, 2026
cdd560d
fix(migration-packs): keep the mapping table's source and target colu…
WilcoLouwerse Oct 13, 2026
9fee28c
test(migration-packs): follow stackiq's TOPdesk packs to version 1.0.0
WilcoLouwerse Oct 13, 2026
170f1cd
test(migration-packs): expect the stackiq module fixture to be raised…
WilcoLouwerse Oct 13, 2026
1db4923
fix(migration-packs): scroll the mapping table sideways and name the …
WilcoLouwerse Oct 13, 2026
4005355
feat(example-sets): one loader installs a story example set across ev…
rubenvdlinde Oct 13, 2026
948520d
style(e2e): prettier on the migration-pack pages spec
WilcoLouwerse Oct 13, 2026
1376825
fix(example-sets): the first live check refused 10 objects the instal…
rubenvdlinde Oct 13, 2026
105008d
fix(files): share and download links use the host the visitor used
rubenvdlinde Oct 13, 2026
1627e89
refactor(files): FileService no longer needs the system config
rubenvdlinde Oct 13, 2026
ca08e00
fix(magic-tables): a table missing metadata columns heals on first use
rubenvdlinde Oct 14, 2026
21843f4
fix(portal): read the portal assertion secret through IAppConfig
rubenvdlinde Oct 14, 2026
c2948ec
docs(magic-tables): tag the reconcile command's configure() with its …
rubenvdlinde Oct 14, 2026
c18bff9
Merge #4609 into train/2026-10-14-zuiddrecht-wave1
rubenvdlinde Oct 14, 2026
217b84b
Merge #4607 into train/2026-10-14-zuiddrecht-wave1
rubenvdlinde Oct 14, 2026
c041561
Merge #4608 into train/2026-10-14-zuiddrecht-wave1
rubenvdlinde Oct 14, 2026
9eaeca8
Merge pull request #4610 from ConductionNL/train/2026-10-14-zuiddrech…
rubenvdlinde Oct 14, 2026
fc7a8ca
fix(example-sets): remove deletes the set's own files and archival ob…
rubenvdlinde Oct 14, 2026
288e773
feat(audit): an object's history is readable by whoever may read the …
rubenvdlinde Oct 14, 2026
4699755
wip(deferral): a deferred listener chunk stays under the job argument…
rubenvdlinde Oct 14, 2026
b08b9fe
fix(descriptors): --import re-imports the real register configuration…
rubenvdlinde Oct 14, 2026
dea9ac9
style(objects): import NotAuthorizedException where the draft write g…
rubenvdlinde Oct 14, 2026
4be40d1
Merge remote-tracking branch 'origin/development' into feat/draft-own…
rubenvdlinde Oct 14, 2026
6f08bbe
Merge branch 'feat/draft-owner-activate-and-lifetime' into feat/draft…
rubenvdlinde Oct 14, 2026
e43abbb
style(objects): import ObjectEventGate where it is built
rubenvdlinde Oct 14, 2026
2365721
refactor(objects): keep the list query builder within the method leng…
rubenvdlinde Oct 14, 2026
45602db
Merge branch 'feat/draft-owner-activate-and-lifetime' into feat/draft…
rubenvdlinde Oct 14, 2026
f86fcd4
fix(import): a shipped seed object reaches an instance that already h…
rubenvdlinde Oct 14, 2026
151db71
fix(objects): the owner's activation finds a register made in another…
rubenvdlinde Oct 14, 2026
4c7e71e
Merge branch 'feat/draft-owner-activate-and-lifetime' into feat/draft…
rubenvdlinde Oct 14, 2026
1eb62a9
docs(objects): the deferred event job names its spec (gate 16)
rubenvdlinde Oct 14, 2026
70a4f83
feat(example-sets): kept objects follow their references, and fragmen…
rubenvdlinde Oct 14, 2026
8991c9a
Merge pull request #4635 from ConductionNL/fix/seed-objects-follow-th…
rubenvdlinde Oct 15, 2026
3b2e895
Merge pull request #4600 from ConductionNL/feat/draft-owner-activate-…
rubenvdlinde Oct 15, 2026
3473e7a
Merge pull request #4633 from ConductionNL/feat/draft-creation-side-e…
rubenvdlinde Oct 15, 2026
012e1bc
feat(rbac): a special right to manage the grants on a record (#4601)
rubenvdlinde Oct 15, 2026
3080787
feat(lifecycle): a transition input can name its field and offer its …
rubenvdlinde Oct 15, 2026
bc39caf
Merge pull request #4638 from ConductionNL/feat/transition-input-offe…
rubenvdlinde Oct 15, 2026
64146ae
Merge remote-tracking branch 'origin/development' into feat/woo588-mi…
WilcoLouwerse Oct 15, 2026
bafcb3b
Merge pull request #4602 from ConductionNL/feat/woo588-migration-pack…
WilcoLouwerse Oct 15, 2026
f939dca
chore(openspec): archive github-provider-code-search after the live h…
WilcoLouwerse Oct 15, 2026
0ff6ac7
docs(openspec): refusal scenario names the static 403; task 2.4 state…
WilcoLouwerse Oct 15, 2026
624f7de
fix(deps): symfony/yaml 6.4.48 clears CVE-2026-109413 (Hydra gate 4)
WilcoLouwerse Oct 15, 2026
0c61e09
Merge pull request #4643 from ConductionNL/fix/symfony-composer-audit…
WilcoLouwerse Oct 15, 2026
f833403
Merge branch 'development' into chore/archive-woo585-github-changes
WilcoLouwerse Oct 15, 2026
b9e5d8d
Merge pull request #4642 from ConductionNL/chore/archive-woo585-githu…
WilcoLouwerse Oct 15, 2026
5947044
fix(example-sets): a set may require a register OpenRegister ships on…
rubenvdlinde Oct 15, 2026
b637c7c
refactor(example-sets): a mock import is its own method, not a flag
rubenvdlinde Oct 15, 2026
5296caf
feat(relations): read an object's tree along its declared parent prop…
rubenvdlinde Oct 15, 2026
f3759ef
feat(brp): count the people registered at an address object, a number…
rubenvdlinde Oct 15, 2026
4d6fdde
Merge pull request #4658 from ConductionNL/fix/example-set-requires-m…
rubenvdlinde Oct 15, 2026
2f67f25
fix(magic-tables): a property named with an underscore is read as a p…
rubenvdlinde Oct 15, 2026
f28140d
refactor(magic-tables): the column classifier is an instance, and the…
rubenvdlinde Oct 16, 2026
f474f0d
Merge pull request #4661 from ConductionNL/fix/g4-zuiddrecht-r2-findings
rubenvdlinde Oct 16, 2026
d9bbd36
chore(deps): bump zod from 4.6.5 to 4.6.7 (#4630)
dependabot[bot] Oct 16, 2026
1050ca7
chore(deps-dev): bump @playwright/test from 1.63.0 to 1.64.0 (#4627)
dependabot[bot] Oct 16, 2026
7bfc17b
chore(deps): bump smalot/pdfparser from 2.12.5 to 2.13.0 (#4626)
dependabot[bot] Oct 16, 2026
b5f34ac
chore(deps-dev): bump @typescript-eslint/parser from 8.68.0 to 8.71.2…
dependabot[bot] Oct 16, 2026
821dec7
chore(deps): bump vue-material-design-icons from 5.3.1 to 5.4.0 (#4623)
dependabot[bot] Oct 16, 2026
8e7bbd8
chore(deps): bump webonyx/graphql-php from 15.37.3 to 15.38.1 (#4621)
dependabot[bot] Oct 16, 2026
1c6b6df
feat(search): filter on a field inside an object property (#4670)
rubenvdlinde Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .procedure-code-baseline.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"count": 0}
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@
- **Word-family text extraction now captures all content and supports legacy `.doc` and `.odt`.** `TextExtractionService::extractWord()` was rewritten around a recursive PhpWord element walker (`walkWordElements`, depth-capped at `MAX_WORD_DEPTH = 50`) that descends tables (rows → cells, including nested tables and in-cell text-runs / list items), section headers and footers, and document-level footnotes/endnotes — content the previous 2-level traversal silently dropped (notably entire tables, because a PhpWord `Table` exposes `getRows()`, not `getElements()`, so the old loop skipped it). The PhpWord reader is now selected from the file MIME / extension (`resolveWordReader`): `.docx` → `Word2007`, legacy `.doc` → `MsDoc`, `.odt` → `ODText` — previously the default `Word2007` reader was always used, so `.doc` and `.odt` failed to load even when routed. `application/vnd.oasis.opendocument.text` is added to the Word routing in `isWordDocument()`. (`text-extraction-word-completeness`)

### Behaviour changes
- **A draft no longer fires `ObjectCreatedEvent`, `ObjectUpdatedEvent` or `ObjectDeletedEvent` (`draft-creation-side-effects`, decision 227).** A draft is an object in status `draft`. Flows, webhooks, activity, push, metrics and notifications no longer run on a draft's saves or its delete. They run once, when the draft leaves draft: `ObjectCreatedEvent` is dispatched then, followed by `ObjectActivatedEvent`. A listener on `ObjectCreatedEvent` needs no status check. Do creation work on `ObjectCreatedEvent` only. A listener that does it on `ObjectActivatedEvent` too runs twice. Objects that never were a draft behave as before.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 CHANGELOG omits this release's upgrade-visible behaviour changes

The release adds three CHANGELOG bullets, all about drafts. These changes ship to beta with no entry:

git grep -n -i 'roles block\|frozen\|archived object\|personal settings' CHANGELOG.md returns nothing.

- **A draft can no longer be changed by somebody who cannot read it (`draft-owner-activation-and-lifetime`).** A draft is visible to its owner only. Until now a second account could still change it: a `PATCH` on the draft, or a `POST` that named its id, was judged by the schema's create rule and stored over the draft. The answer held the draft's content. Both now answer 403. `GET`, `PUT` and `DELETE` already answered 404. An administrator may still correct a draft, and a schema with `draftsVisible: true` keeps its own rules.
- **Upgrade note: drafts now expire after 30 days (`draft-owner-activation-and-lifetime`, decisions 216, 226 and 228).** A draft is an object in status `draft`. A draft that nobody changed for 30 days is removed by the daily job `DraftExpiryJob`, for good and with its files. This applies to drafts that exist today: **the first run of the job after the upgrade removes every draft older than 30 days**, at most 1,000 per run. Look before it runs: `occ openregister:drafts:expired` lists how many drafts the next run would remove per schema, and removes nothing. To keep the drafts of a schema, set `"draftLifetimeDays": false` in its configuration. A whole number of days, 1 or more, sets another lifetime. The lifetime counts from the draft's last change. Each removed draft leaves one audit-trail entry (`draft.removed`) that says who or which job removed it, when, in which register and schema, and which object. The entry never holds what the draft contained. The job logs a count per schema.
- **Dashboard right sidebar is now collapsed by default on initial load.** The dashboard view (route `/`) renders with its right-hand app sidebar closed so the dashboard's primary content is unobstructed on arrival. The sidebar remains fully functional — the standard Nextcloud sidebar toggle opens it, and its filters, system totals, and orphaned-items sections behave identically once open. No other view's sidebar default open/closed state changes. (`dashboard-sidebar-default-state`)
- **File access is permission-based and ownership-agnostic; objects can link files owned by other users.** `FileValidationHandler::checkOwnership()` now grants access on `Node::isReadable()` alone instead of denying when the file's owner UID differs from the session user — fixing `File <name> is not owned by the current session` errors when uploading, viewing, updating, or deleting a file reached via a Nextcloud share or owned by a user other than the `openregister` system user. The update and delete paths now assert `Node::isUpdateable()` / `Node::isDeletable()` before mutating (failing fast with `NotPermittedException` in addition to Nextcloud's native enforcement), and `FileOwnershipHandler::transferFileOwnershipIfNeeded()` no longer re-owns a file to the system user when the current user already has write rights — ownership follows the folder's mount owner (the system user inside the OpenRegister folder; the original owner for a folder linked from outside it), with re-owning retained only as a fallback. (`file-permission-share-access`)
- **`POST /api/files/{fileId}/anonymize` on PDF inputs now produces a clean output instead of a corrupted file.** Tenants that relied on the previous (broken) behaviour — where the byte-level `str_ireplace` path returned an unopenable PDF — need to verify nothing in their downstream pipeline assumed a corrupt PDF (e.g. mailers that retried on parse failure, viewer dashboards that rendered placeholders for unopenable attachments). The endpoint URL, auth model, and request shape are unchanged. PDF-specific failure responses are now structured (`{ "error": "pdf_anonymisation_failed", "reason": "<reason>", "details": { ... } }`) with reason-specific HTTP statuses — see the `### Added` entry for the full reason-to-status table. Encrypted PDFs are explicitly rejected (HTTP 422); image-only scans defer to the OCR capability (HTTP 422 with `text_layer_missing` reason); the strict-mode validation gate fails closed (HTTP 500 with `validation_failed`) when any substitution-map entry still appears in the re-extracted output. (`pdf-anonymisation`)
Expand Down
21 changes: 19 additions & 2 deletions appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ Open Register drijft apps zoals OpenCatalogi, Procest, Pipelinq en Software Cata

Vrij en open source onder de EUPL-licentie.
]]></description>
<version>2.1.35-unstable.20261009130000</version>
<version>2.1.35-unstable.20261012153000</version>
<licence>EUPL-1.2</licence>
<author mail="info@conduction.nl" homepage="https://www.conduction.nl/">Conduction</author>
<namespace>OpenRegister</namespace>
Expand Down Expand Up @@ -131,6 +131,7 @@ Vrij en open source onder de EUPL-licentie.

<background-jobs>
<job>OCA\OpenRegister\BackgroundJob\LogCleanUpTask</job>
<job>OCA\OpenRegister\BackgroundJob\FormUploadPurgeJob</job>
<job>OCA\OpenRegister\BackgroundJob\RecomputeTimersForCalendarJob</job>
<job>OCA\OpenRegister\BackgroundJob\StateHistoryRebuildJob</job>
<job>OCA\OpenRegister\BackgroundJob\ViewAlertSweepJob</job>
Expand Down Expand Up @@ -188,6 +189,13 @@ Vrij en open source onder de EUPL-licentie.
<job>OCA\OpenRegister\BackgroundJob\OAuth2TokenRefreshJob</job>
<job>OCA\OpenRegister\BackgroundJob\ScheduledReportJob</job>
<job>OCA\OpenRegister\BackgroundJob\GroupReconcilerJob</job>
<!--
Removes the drafts that outlived their schema's draft lifetime:
30 days, or what the configuration key draftLifetimeDays says
(decisions 216 and 228). Without this line the lifetime is
stored and never acted on.
-->
<job>OCA\OpenRegister\BackgroundJob\DraftExpiryJob</job>
</background-jobs>

<repair-steps>
Expand Down Expand Up @@ -273,6 +281,7 @@ Vrij en open source onder de EUPL-licentie.
and a reversal that has nothing to read. -->
<step>OCA\OpenRegister\Repair\ImportMergeOperationRegister</step>
<step>OCA\OpenRegister\Repair\ImportDismissedPairRegister</step>
<step>OCA\OpenRegister\Repair\ImportDecisionTableRegister</step>
<!-- ONE STORE PER FLOW. Flows lived in two places — this table and
objects in the `flows` register — and every subsystem reads the
table. Measured with controls: the same definition fires and
Expand Down Expand Up @@ -450,6 +459,7 @@ Vrij en open source onder de EUPL-licentie.
and a reversal that has nothing to read. -->
<step>OCA\OpenRegister\Repair\ImportMergeOperationRegister</step>
<step>OCA\OpenRegister\Repair\ImportDismissedPairRegister</step>
<step>OCA\OpenRegister\Repair\ImportDecisionTableRegister</step>
<!-- ONE STORE PER FLOW. Flows lived in two places — this table and
objects in the `flows` register — and every subsystem reads the
table. Measured with controls: the same definition fires and
Expand Down Expand Up @@ -509,19 +519,26 @@ Vrij en open source onder de EUPL-licentie.
<command>OCA\OpenRegister\Command\DedupeConfigurationsCommand</command>
<command>OCA\OpenRegister\Command\ResolverListCommand</command>
<command>OCA\OpenRegister\Command\TimeReconcileCommand</command>
<!-- Read-only: how many drafts the daily draft cleanup would remove per
schema. For a look before the first run after an upgrade (decision 228). -->
<command>OCA\OpenRegister\Command\DraftsExpiredCommand</command>
<!-- Web Push VAPID keypair generation (openregister-web-push-engine). Light DI graph (IAppConfig only). -->
<command>OCA\OpenRegister\Command\GenerateVapidKeys</command>
<!-- Reconcile the `tables` virtual register with the Nextcloud Tables app. -->
<command>OCA\OpenRegister\Command\TablesSyncCommand</command>
<!-- Batched Context Chat backfill for opted-in, published objects. -->
<command>OCA\OpenRegister\Command\ContextChatReindexCommand</command>
<!-- Story example sets: one cast, a fragment per app (example-sets). The
store fetches ObjectService lazily, so the DI graph stays light. -->
<command>OCA\OpenRegister\Command\ExampleSetInstallCommand</command>
<command>OCA\OpenRegister\Command\ExampleSetRemoveCommand</command>
<command>OCA\OpenRegister\Command\ExampleSetListCommand</command>
</commands>

<settings>
<admin>OCA\OpenRegister\Settings\OpenRegisterAdmin</admin>
<admin>OCA\OpenRegister\Settings\IntegrationsAdminSettings</admin>
<admin-section>OCA\OpenRegister\Sections\OpenRegisterAdmin</admin-section>
<personal>OCA\OpenRegister\Settings\OpenRegisterPersonal</personal>
</settings>

<!-- The notifier is registered in PHP:
Expand Down
23 changes: 22 additions & 1 deletion appinfo/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,12 @@
['name' => 'objectOwnership#setOwnerGroup', 'url' => '/api/objects/{register}/{schema}/{id}/ownership/group', 'verb' => 'PUT', 'requirements' => ['register' => '[^/]+', 'schema' => '[^/]+', 'id' => '[^/]+']],
['name' => 'objectOwnership#reassign', 'url' => '/api/ownership/reassign', 'verb' => 'POST'],

// A draft's owner makes it definitive (decision 216). An explicit action:
// a PUT or PATCH that sets `@self.status` to `active` stays refused, so
// nothing leaves draft by accident. A plain Controller, so a refusal
// keeps its status (OCSMiddleware would turn a 403 into a 200).
['name' => 'objectDraft#activate', 'url' => '/api/objects/{register}/{schema}/{id}/activate', 'verb' => 'POST', 'requirements' => ['register' => '[^/]+', 'schema' => '[^/]+', 'id' => '[^/]+']],

// Who holds which right on one object, and how that set changed. The
// other direction of `/api/scopes`: that one answers a caller about
// themselves, these answer an auditor about everybody. Reading the
Expand Down Expand Up @@ -1193,6 +1199,11 @@
['name' => 'objects#geocode', 'url' => '/api/geo/geocode', 'verb' => 'GET'],

['name' => 'objects#create', 'url' => '/api/objects/{register}/{schema}', 'verb' => 'POST'],
// Decision 179 (ADR-117): a form submits into its destination object.
['name' => 'forms#validate', 'url' => '/api/forms/validate', 'verb' => 'POST'],
['name' => 'forms#submit', 'url' => '/api/forms/{formId}/submit', 'verb' => 'POST'],
['name' => 'forms#upload', 'url' => '/api/forms/{formId}/uploads', 'verb' => 'POST'],
['name' => 'forms#draft', 'url' => '/api/forms/{formId}/draft', 'verb' => 'POST'],
['name' => 'objects#export', 'url' => '/api/objects/{register}/{schema}/export', 'verb' => 'GET'],
// BEFORE objects#show, because `{id}` matches `[^/]+` and a route with
// a longer path must be declared first or the generic one swallows it.
Expand Down Expand Up @@ -1238,6 +1249,7 @@
['name' => 'objectRelations#removeReferences', 'url' => '/api/objects/{register}/{schema}/{id}/relation-references/{anchor}', 'verb' => 'DELETE', 'requirements' => ['id' => '[^/]+', 'anchor' => '[^/]+']],
['name' => 'objectRelations#derive', 'url' => '/api/objects/{register}/{schema}/{id}/derive', 'verb' => 'POST', 'requirements' => ['id' => '[^/]+']],
['name' => 'objectRelations#graph', 'url' => '/api/objects/{register}/{schema}/{id}/graph', 'verb' => 'GET', 'requirements' => ['id' => '[^/]+']],
['name' => 'objectRelations#tree', 'url' => '/api/objects/{register}/{schema}/{id}/tree', 'verb' => 'GET', 'requirements' => ['id' => '[^/]+']],
['name' => 'objectRelations#exportGraph', 'url' => '/api/objects/{register}/{schema}/{id}/graph/export', 'verb' => 'GET', 'requirements' => ['id' => '[^/]+']],
// Locks.
// Whether a row exists in other registers, and nothing about the
Expand Down Expand Up @@ -1837,6 +1849,13 @@
['name' => 'views#update', 'url' => '/api/views/{id}', 'verb' => 'PUT', 'requirements' => ['id' => '[^/]+']],
['name' => 'views#patch', 'url' => '/api/views/{id}', 'verb' => 'PATCH', 'requirements' => ['id' => '[^/]+']],
['name' => 'views#destroy', 'url' => '/api/views/{id}', 'verb' => 'DELETE', 'requirements' => ['id' => '[^/]+']],
// Record templates (records-saved-templates D-4): named values for a new record, shared like a view.
['name' => 'recordTemplates#index', 'url' => '/api/record-templates', 'verb' => 'GET'],
['name' => 'recordTemplates#show', 'url' => '/api/record-templates/{id}', 'verb' => 'GET', 'requirements' => ['id' => '[^/]+']],
['name' => 'recordTemplates#create', 'url' => '/api/record-templates', 'verb' => 'POST'],
['name' => 'recordTemplates#update', 'url' => '/api/record-templates/{id}', 'verb' => 'PUT', 'requirements' => ['id' => '[^/]+']],
['name' => 'recordTemplates#patch', 'url' => '/api/record-templates/{id}', 'verb' => 'PATCH', 'requirements' => ['id' => '[^/]+']],
['name' => 'recordTemplates#destroy', 'url' => '/api/record-templates/{id}', 'verb' => 'DELETE', 'requirements' => ['id' => '[^/]+']],
// Read-only presentation data — drag-to-move goes through the existing
// guarded object PATCH/PUT (/api/objects/{register}/{schema}/{id}), never
// a bespoke endpoint here (REQ-VIEW-KANBAN-03).
Expand Down Expand Up @@ -2011,12 +2030,14 @@
// Migration mapping packs (migration-mapping-packs): declarative
// source-format-to-schema import mappings. Reads (index/show/export)
// are available to any authenticated user so the import flow can
// browse packs; create/update/destroy/import are admin-gated. The
// browse packs; create/update/destroy/import and the preview dry run
// are admin-gated and CSRF-protected. The
// `packId` request param on registers#import (below) resolves a
// pack by its `packSlug` and runs each row through it before save.
['name' => 'migrationPacks#index', 'url' => '/api/migration-packs', 'verb' => 'GET'],
['name' => 'migrationPacks#create', 'url' => '/api/migration-packs', 'verb' => 'POST'],
['name' => 'migrationPacks#import', 'url' => '/api/migration-packs/import', 'verb' => 'POST'],
['name' => 'migrationPacks#preview', 'url' => '/api/migration-packs/preview', 'verb' => 'POST'],
['name' => 'migrationPacks#show', 'url' => '/api/migration-packs/{id}', 'verb' => 'GET', 'requirements' => ['id' => '\d+']],
['name' => 'migrationPacks#update', 'url' => '/api/migration-packs/{id}', 'verb' => 'PUT', 'requirements' => ['id' => '\d+']],
['name' => 'migrationPacks#destroy', 'url' => '/api/migration-packs/{id}', 'verb' => 'DELETE', 'requirements' => ['id' => '\d+']],
Expand Down
Loading
Loading