Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1037 commits
Select commit Hold shift + click to select a range
26e9166
chore: build result (#73)
rubenvdlinde Apr 20, 2026
b84d797
chore(hydra): pattern-tag browser-test-nc-setup-failed [skip ci]
Apr 20, 2026
cd6adb2
chore(hydra): record pre-review-quality stage [skip ci]
Apr 20, 2026
605b814
chore(hydra): record quality-recheck stage [skip ci]
Apr 20, 2026
4d81298
chore(hydra): pattern-tag recheck-caught-new-findings [skip ci]
Apr 20, 2026
961471c
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 20, 2026
4b79716
chore: build result (#45)
rubenvdlinde Apr 21, 2026
671979a
feat: implement core meeting management backend services (#60)
Apr 21, 2026
6bb867b
feat: add meeting store and update meetings list view (#60)
Apr 21, 2026
1ba538e
test: add QuorumService tests and update plan (#60)
Apr 21, 2026
0c0efd5
chore: build result (#60)
rubenvdlinde Apr 21, 2026
9852718
chore(hydra): init cycle (trigger=build:queued) [skip ci]
Apr 21, 2026
49f6704
chore(hydra): record build stage [skip ci]
Apr 21, 2026
b6a92df
chore(hydra): pattern-tag browser-test-nc-setup-failed [skip ci]
Apr 21, 2026
d031fa1
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
aa0800a
feat: backend for p2-motion-and-voting-core-t2 (#47)
Apr 21, 2026
c9c564d
doc(tasks): mark backend tasks 0-3 complete (#47)
Apr 21, 2026
ddb5f9a
doc(design): update status to pr-created (#47)
Apr 21, 2026
16943c1
chore(hydra): record quality-recheck stage [skip ci]
Apr 21, 2026
023833e
chore(hydra): pattern-tag reviewer-ran-applied-no-fixes [skip ci]
Apr 21, 2026
bdd2b0f
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
52d0d81
chore: build result (#47)
rubenvdlinde Apr 21, 2026
10ad05c
chore(hydra): init cycle (trigger=build:queued) [skip ci]
Apr 21, 2026
dd878b9
chore(hydra): record build stage [skip ci]
Apr 21, 2026
f74eb1b
chore(hydra): pattern-tag browser-test-nc-setup-failed [skip ci]
Apr 21, 2026
5b92d8e
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
80dd36a
chore(hydra): record quality-recheck stage [skip ci]
Apr 21, 2026
81bb8c1
chore(hydra): pattern-tag reviewer-ran-applied-no-fixes [skip ci]
Apr 21, 2026
6fe99b3
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
2fdba22
chore(hydra): init cycle (trigger=retry:queued) [skip ci]
Apr 21, 2026
9eef7f3
Merge remote-tracking branch 'origin/development' into feature/60/p2-…
Apr 21, 2026
ee33b80
fix (retry): phpcs @spec tags, phpunit constructor mismatch, quorum t…
Apr 21, 2026
c19423e
fix(rule-0b): correct JSONResponse named arg status→statusCode (#60)
Apr 21, 2026
8341ddc
fix(rule-0b): add missing @spec PHPDoc tags to classes and methods (#60)
Apr 21, 2026
19560f2
chore(hydra): record fix stage [skip ci]
Apr 21, 2026
d3b8953
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
a85035a
fix(review): replace non-existent getJsonBody() and remove unused Wor…
Apr 21, 2026
2e48a32
chore(hydra): record quality-recheck stage [skip ci]
Apr 21, 2026
5a721d0
chore(hydra): pattern-tag reviewer-ran-applied-no-fixes [skip ci]
Apr 21, 2026
824df91
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
72bc329
chore(hydra): init cycle (trigger=retry:queued) [skip ci]
Apr 21, 2026
dd9abd4
fix (retry): add --no-coverage to phpunit scripts to prevent exit 1 i…
infoconductionnl Apr 21, 2026
f28bece
chore(hydra): record fix stage [skip ci]
Apr 21, 2026
3912ff5
chore(hydra): init cycle (trigger=retry:queued) [skip ci]
Apr 21, 2026
1c16d21
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
8dfa6e3
Merge remote-tracking branch 'origin/development' into feature/47/p2-…
Apr 21, 2026
f4ef50a
fix (retry): replace forbidden error_log with logger->warning (#47)
Apr 21, 2026
45b67cb
fix(review): apply code review fixes
Apr 21, 2026
aa2e222
fix(rule-0b): iter 1 fix pass (#47)
Apr 21, 2026
04103d4
fix(rule-0b): resolve phpcs violations — ! operator and missing @spec…
Apr 21, 2026
990dc86
chore(hydra): record fix stage [skip ci]
Apr 21, 2026
4c7a6d2
chore(hydra): record quality-recheck stage [skip ci]
Apr 21, 2026
a28c6c9
chore: applier verdict (#130)
rubenvdlinde Apr 21, 2026
51b37a5
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
8ff865b
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
7b5d4d6
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
c797562
fix(review): apply code review fixes
Apr 21, 2026
298a51d
chore(hydra): record quality-recheck stage [skip ci]
Apr 21, 2026
d92706a
chore(hydra): pattern-tag reviewer-ran-applied-no-fixes [skip ci]
Apr 21, 2026
302c5b8
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
eeabf9e
chore(hydra): record quality-recheck stage [skip ci]
Apr 21, 2026
7daaaf4
chore: applier verdict (#131)
rubenvdlinde Apr 21, 2026
2dfa38e
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
5da4eef
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
122bfd5
chore(hydra): record quality-recheck stage [skip ci]
Apr 21, 2026
5dba088
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
3e27d0c
chore(hydra): record quality-recheck stage [skip ci]
Apr 21, 2026
0a0e92e
chore: applier verdict (#131)
rubenvdlinde Apr 21, 2026
dc72231
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
66e189f
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
cd460d2
chore: applier verdict (#130)
rubenvdlinde Apr 21, 2026
329868e
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
b05ed22
chore: applier verdict (#131)
rubenvdlinde Apr 21, 2026
ff50416
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
7a8641a
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
65ff421
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
1e55157
chore: applier verdict (#130)
rubenvdlinde Apr 21, 2026
8591767
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
9e5038e
chore: applier verdict (#131)
rubenvdlinde Apr 21, 2026
cd82c36
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
b2ece9e
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
b3e06d9
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
87ec3f0
chore: applier verdict (#130)
rubenvdlinde Apr 21, 2026
17891fe
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
248271a
chore: applier verdict (#131)
rubenvdlinde Apr 21, 2026
3a20060
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
0028695
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
f439e95
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
0a282df
chore: applier verdict (#131)
rubenvdlinde Apr 21, 2026
6a05837
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
5fdf930
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
3f5c852
chore: applier verdict (#130)
rubenvdlinde Apr 21, 2026
6ce400b
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
79984c1
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
b8e3571
chore(hydra): init cycle (trigger=retry:queued) [skip ci]
Apr 21, 2026
b07a15b
chore(hydra): init cycle (trigger=retry:queued) [skip ci]
Apr 21, 2026
576eea3
Merge remote-tracking branch 'origin/development' into feature/60/p2-…
algorithm-conduction Apr 21, 2026
f39ccd6
Merge remote-tracking branch 'origin/development' into feature/47/p2-…
Apr 21, 2026
9474cbb
fix (retry): add missing auth annotations + unit tests for new classe…
Apr 21, 2026
2915bd0
chore(hydra): record fix stage [skip ci]
Apr 21, 2026
b1be07f
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
cb0213b
fix (retry): wire WorkflowService and QuorumService into MeetingServi…
algorithm-conduction Apr 21, 2026
4c907e9
chore(hydra): init cycle (trigger=retry:queued) [skip ci]
Apr 21, 2026
29c8393
fix(review): remove orphaned duplicate docblocks from VotingService
Apr 21, 2026
69a4c94
Merge remote-tracking branch 'origin/development' into feature/44/p2-…
infoconductionnl Apr 21, 2026
16edaf1
chore(hydra): record fix stage [skip ci]
Apr 21, 2026
17a1d16
fix(security): add requireChairOrSecretary guard to forward() endpoint
rubenvdlinde Apr 21, 2026
e40f294
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
de6999c
fix (retry): resolve phpunit failures and phpcs violations (#44)
infoconductionnl Apr 21, 2026
5818593
chore(hydra): record fix stage [skip ci]
Apr 21, 2026
25ff751
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
94312b6
fix(review): add @NoAdminRequired to AnalyticsController and LiveMeet…
Apr 21, 2026
b9848b7
chore: applier verdict (#130)
rubenvdlinde Apr 21, 2026
566193a
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
6cea721
chore(hydra): close cycle outcome=done [skip ci]
Apr 21, 2026
34182b6
Merge pull request #130 from ConductionNL/feature/60/p2-meeting-manag…
rubenvdlinde Apr 21, 2026
0707d2c
chore: applier verdict (#129)
rubenvdlinde Apr 21, 2026
8f95433
chore: applier verdict (#127)
rubenvdlinde Apr 21, 2026
9e5e779
chore(hydra): record applier stage [skip ci]
Apr 21, 2026
8b4e1e1
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 21, 2026
d24179c
chore(hydra): init cycle (trigger=retry:queued) [skip ci]
Apr 21, 2026
9fa9c2d
chore: merge origin/development into feature/44/p2-minutes-and-decisi…
infoconductionnl Apr 21, 2026
82266eb
fix (retry): use params: instead of filters: in QuorumService::findOb…
infoconductionnl Apr 21, 2026
8ac978e
fix(rule-0b): route-auth — fix live_meeting route name and add NoAdmi…
infoconductionnl Apr 21, 2026
de3d7ca
chore(hydra): record fix stage [skip ci]
Apr 21, 2026
beee342
chore(hydra): record pre-review-quality stage [skip ci]
Apr 21, 2026
09e2f21
fix (retry): add auth guards to MinutesController T3 methods and fix …
Apr 21, 2026
1804500
chore(hydra): record fix stage [skip ci]
Apr 21, 2026
d6307bf
fix(security): apply security review fixes — gate-6 + gate-7 (OWASP A…
Apr 21, 2026
135359e
chore(hydra): record fix stage [skip ci]
Apr 22, 2026
be4b83a
fix (retry): resolve Nextcloud UIDs for notifications and scope parti…
Apr 22, 2026
290a989
chore(hydra): record fix stage [skip ci]
Apr 22, 2026
1d7af02
chore(hydra): record fix stage [skip ci]
Apr 22, 2026
af81652
fix(Settings): add auth guards for index + admin attribute for load (…
rubenvdlinde Apr 23, 2026
21dbdc7
chore: applier verdict (#127)
rubenvdlinde Apr 23, 2026
5a68a04
chore(hydra): record applier stage [skip ci]
Apr 23, 2026
7471b0f
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 23, 2026
ed5cc2f
chore(hydra): init cycle (trigger=retry:queued) [skip ci]
Apr 23, 2026
0dd2c3b
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
8e75c8f
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
89e9640
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
0ffba76
adr: push 4 architecture decisions from Specter
Apr 23, 2026
f5adbdc
feat: Add OpenSpec change p2-motion-and-voting-core-t1 from Specter
Apr 23, 2026
e9738de
feat: Add OpenSpec change p2-motion-and-voting-core-t1 from Specter
Apr 23, 2026
fb3297e
chore: link issue to hydra.json for p2-motion-and-voting-core-t1
Apr 23, 2026
a96008c
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
e6cdf50
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
308ae5b
Merge remote-tracking branch 'origin/development' into HEAD
rubenvdlinde Apr 23, 2026
552b643
chore: build result (#134)
rubenvdlinde Apr 23, 2026
00e9ead
chore: build result (#135)
rubenvdlinde Apr 23, 2026
3d2af1d
chore: build result (#136)
rubenvdlinde Apr 23, 2026
d4ff6e1
chore: build result (#134)
rubenvdlinde Apr 23, 2026
3436b5f
chore: build result (#135)
rubenvdlinde Apr 23, 2026
d1af556
fix(auth): align @NoAdminRequired + admin-body to #[AuthorizedAdminSe…
Apr 23, 2026
408f375
chore: build result (#134)
rubenvdlinde Apr 23, 2026
465251d
chore: build result (#136)
rubenvdlinde Apr 23, 2026
f19705e
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
c3c1d70
Revert "fix(auth): align @NoAdminRequired + admin-body to #[Authorize…
Apr 23, 2026
bee71e1
chore: build result (#134)
rubenvdlinde Apr 23, 2026
a4b527e
chore: build result (#136)
rubenvdlinde Apr 23, 2026
6d789a1
chore: build result (#135)
rubenvdlinde Apr 23, 2026
93df99c
chore: build result (#134)
rubenvdlinde Apr 23, 2026
9ef313e
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
208ce33
Merge remote-tracking branch 'origin/development' into feature/47/p2-…
rubenvdlinde Apr 23, 2026
7421301
Merge pull request #131 from ConductionNL/feature/47/p2-motion-and-vo…
rubenvdlinde Apr 23, 2026
0212de6
chore: applier verdict (#129)
rubenvdlinde Apr 23, 2026
1c4d17a
chore: applier verdict (#129)
rubenvdlinde Apr 23, 2026
84da62d
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
0d69081
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
f31ac49
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
d039b9e
chore(hydra): record fix stage [skip ci]
Apr 23, 2026
453236e
chore: applier verdict (#129)
rubenvdlinde Apr 24, 2026
7b8b9a9
Merge remote-tracking branch 'origin/development' into feature/44/p2-…
Apr 24, 2026
1bbcb82
Merge remote-tracking branch 'origin/feature/44/p2-minutes-and-decisi…
rubenvdlinde Apr 24, 2026
f4788f8
chore(hydra): record fix:failed stage [skip ci]
Apr 24, 2026
01c9d4c
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 24, 2026
9d121fa
chore: applier verdict (#127)
rubenvdlinde Apr 24, 2026
5e89caa
chore(hydra): record applier stage [skip ci]
Apr 24, 2026
2b8ae7e
chore(hydra): close cycle outcome=needs-input [skip ci]
Apr 24, 2026
20bd572
Merge pull request #127 from ConductionNL/feature/44/p2-minutes-and-d…
rubenvdlinde Apr 24, 2026
78ee6d7
chore: applier verdict (#127)
rubenvdlinde Apr 24, 2026
7bcce1f
chore: applier verdict (#129)
rubenvdlinde Apr 24, 2026
8a7d975
chore: applier verdict (#129)
rubenvdlinde Apr 24, 2026
c05b7c2
chore: review round 1 results (#128)
rubenvdlinde Apr 24, 2026
be7cd11
chore: build result (#134)
rubenvdlinde Apr 24, 2026
f06201f
chore: build result (#73)
rubenvdlinde Apr 24, 2026
6ee4adc
chore: build result (#134)
rubenvdlinde Apr 24, 2026
26eae19
chore: build result (#21)
rubenvdlinde Apr 24, 2026
c1da8c4
chore: add .github/CODEOWNERS for auto-review-request (#142)
rubenvdlinde May 3, 2026
0c26b1e
feat(openspec): decidesk-manifest-v1 — v0.3.0 → 1.0.0 + multi-tenancy…
rubenvdlinde May 3, 2026
7e13d52
chore: bump @conduction/nextcloud-vue to ^0.1.0-beta.17 (#144)
rubenvdlinde May 3, 2026
4b70fde
feat(openspec): decidesk-legacy-quality-cleanup tracking change (#145)
rubenvdlinde May 3, 2026
61e0eb6
feat(openspec): quorum-declarative-migration — first ADR-031-aware spec
rubenvdlinde May 6, 2026
dc05e9e
feat(openspec): actionitem-analytics-declarative-migration — second A…
rubenvdlinde May 6, 2026
988e63a
Merge pull request #146 from ConductionNL/feature/quorum-declarative-…
rubenvdlinde May 7, 2026
85ebd1f
Merge pull request #147 from ConductionNL/feature/actionitem-analytic…
rubenvdlinde May 7, 2026
766cb8c
feat(openspec): split quorum-declarative-migration into 3-spec chain …
rubenvdlinde May 7, 2026
19575a9
Merge pull request #150 from ConductionNL/feature/quorum-chain-split
rubenvdlinde May 7, 2026
0f16d04
feat(openspec): manifest-version-bump — minimal kind:config Hydra tes…
rubenvdlinde May 8, 2026
aeb4cc9
Merge pull request #152 from ConductionNL/feature/manifest-version-bump
rubenvdlinde May 8, 2026
9627421
feat: bump manifest version 0.3.0 → 0.4.0 (#153)
infoconductionnl May 8, 2026
6ac081d
fix(rule-0b): mock user session in index test to pass auth check (#153)
infoconductionnl May 8, 2026
6e9b052
fix(rule-0b): iter 1 fix pass (#153)
May 8, 2026
ba96f71
chore: add task-audit.json for manifest-version-bump spec (#153)
infoconductionnl May 8, 2026
70d963b
chore: build result (#153)
rubenvdlinde May 8, 2026
a2b8477
chore: review round 1 results (#154)
rubenvdlinde May 8, 2026
0fde7bf
Merge pull request #154 from ConductionNL/feature/153/manifest-versio…
rubenvdlinde May 8, 2026
0eb320d
chore: build result (#151)
rubenvdlinde May 8, 2026
3dcd3ce
feat(spec): implement spec (#151) (#156)
rubenvdlinde May 8, 2026
737e89a
feat(spec): implement spec (#157) (#158)
rubenvdlinde May 8, 2026
b5c88cd
feat(manifest): migrate decidesk to JSON manifest renderer (decidesk-…
rubenvdlinde May 8, 2026
4b49bca
feat(manifest): cleanup follow-up — adopt CnAppRoot + migrate Setting…
rubenvdlinde May 9, 2026
9494e54
feat(manifest): implement 9 sidebar relation tabs (full CRUD)
rubenvdlinde May 9, 2026
ed34703
chore(deps): bump @conduction/nextcloud-vue to 1.0.0-beta.5 + webpack…
rubenvdlinde May 9, 2026
fdfb036
i18n + finishing touches on the manifest-driven sidebar tabs
rubenvdlinde May 9, 2026
50e4df7
feat(boot): mount-survivable bootstrap + en_US locale alias
rubenvdlinde May 9, 2026
866ff13
chore(deps): bump @conduction/nextcloud-vue to 1.0.0-beta.12
rubenvdlinde May 9, 2026
a5fbb0e
Merge pull request #160 from ConductionNL/feature/decidesk-manifest-v1
rubenvdlinde May 9, 2026
15dc208
feat(live): bump @conduction/nextcloud-vue to 1.0.0-beta.6, replace L…
rubenvdlinde May 9, 2026
76c35c3
docs(spec): decidesk-store-migration — proposal/design/spec/tasks
rubenvdlinde May 10, 2026
dc87c5d
refactor(store): replace custom Pinia object store with @conduction/n…
rubenvdlinde May 10, 2026
d7df2ba
fix(decidesk): migrate consumers from fetchObjects to fetchCollection…
rubenvdlinde May 10, 2026
9fd837d
Merge pull request #163 from ConductionNL/feature/decidesk-store-migr…
rubenvdlinde May 10, 2026
3b99f05
fix: await initializeStores() before mounting Vue (#165)
rubenvdlinde May 10, 2026
ed73441
feat(dashboard): wire stats-block widgets to OpenRegister GraphQL via…
rubenvdlinde May 10, 2026
722e852
Merge pull request #167 from ConductionNL/feat/dashboard-datasource
rubenvdlinde May 10, 2026
c71754b
chore: bump @conduction/nextcloud-vue to 1.0.0-beta.30 (#168)
rubenvdlinde May 10, 2026
a77de9f
chore: add missing @nextcloud/* peer dependencies to fix dev baseline…
rubenvdlinde May 10, 2026
77ac7a1
chore(stylelint): add missing @nextcloud/stylelint-config peer deps (…
rubenvdlinde May 10, 2026
9d5c8da
feat(p3-citizen-participation): apply spec (partial — i18n deferred) …
rubenvdlinde May 11, 2026
bbe34a7
feat(p4-integration): apply spec (partial — i18n deferred) (#172)
rubenvdlinde May 11, 2026
8eb7ee9
feat(p4-collaboration): apply spec (partial — gates + i18n deferred) …
rubenvdlinde May 11, 2026
4fa89b9
chore(openspec): complete specs/<cap>/spec.md for 5 decidesk changes …
rubenvdlinde May 11, 2026
b776151
chore(openspec): complete specs/<cap>/spec.md for 4 quorum/analytics …
rubenvdlinde May 11, 2026
3584934
chore(openspec): cleanup p2-mad-core-t1 + add legacy-quality design.m…
rubenvdlinde May 11, 2026
dfd51a5
feat(mcp-tools): DecideskToolProvider — first per-app IMcpToolProvider
rubenvdlinde May 11, 2026
b64544f
Merge pull request #178 from ConductionNL/feature/decidesk-mcp-tools
rubenvdlinde May 11, 2026
bacd03d
chore(openspec): mark applied + archive clean changes + cleanup (#179)
rubenvdlinde May 11, 2026
e4be25e
chore(openspec): normalize spec format + archive newly-clean changes …
rubenvdlinde May 11, 2026
9681492
feat(manifest): route Decisions through CnPageRenderer (Tier 2 pilot)…
rubenvdlinde May 12, 2026
17af18c
feat: adopt the Features & Roadmap menu (#183)
rubenvdlinde May 12, 2026
23a7643
feat: meeting integrations surface via the pluggable integration regi…
rubenvdlinde May 12, 2026
49b3fc8
fix: white fill on app.svg so the navigation header icon renders corr…
rubenvdlinde May 12, 2026
93ef1e8
feat: distinct app icon for decidesk (#187)
rubenvdlinde May 12, 2026
10ff245
chore(deps): bump @conduction/nextcloud-vue to ^1.0.0-beta.40
rubenvdlinde May 12, 2026
587579f
Merge pull request #189 from ConductionNL/chore/bump-nc-vue-beta40
rubenvdlinde May 12, 2026
6f41882
docs(journeydoc): bootstrap capture-driven user documentation (#190)
rubenvdlinde May 12, 2026
f5b03e9
Merge branch 'feature/integration-registry-sidebar' into development
rubenvdlinde May 12, 2026
c36c7ad
docs: brand landing page + bump @conduction/docusaurus-preset to 1.5.…
rubenvdlinde May 12, 2026
a377866
chore(docs): bump @conduction/docusaurus-preset to 2.6.1 (#193)
rubenvdlinde May 12, 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
  •  
  •  
  •  
221 changes: 221 additions & 0 deletions .claude/openspec/architecture/adr-001-data-layer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
- ALL domain data → OpenRegister objects. NO custom Entity/Mapper for domain data.
- App config → `IAppConfig`. NOT OpenRegister.
- Cross-entity references: OpenRegister relations (register+schema+objectId). NO foreign keys.
MUST NOT store foreign keys or embed full objects.

### Schema standards

- Schemas: PascalCase, schema.org vocabulary, explicit types + required flags + description field.
- MUST NOT invent custom property names when a schema.org equivalent exists.
- Contact schemas MUST align with vCard properties (fn, email, tel, adr).
- Dutch government fields SHOULD use a mapping layer translating between international standards
and Dutch specs — do not hardcode Dutch field names as primary.
- Schema changes that remove or rename properties are BREAKING. Adding optional properties is non-breaking.

### Register templates

- Location: `lib/Settings/{app}_register.json` (OpenAPI 3.0 + `x-openregister` extensions).
- Three template categories:
- **App configuration** — define data models (schemas/registers/views/mappings).
Mark with `x-openregister.type: "application"`.
- **Mock data** — fictional but realistic seed data for dev/test.
Mark with `x-openregister.type: "mock"`.
- **Government standards** — aligned to Dutch API specs (BAG, BRP, KVK, DSO).
- Import mechanism: `ConfigurationService::importFromApp(appId, data, version, force)` →
`ImportHandler::importFromApp()`. Called from repair step or `SettingsLoadService`.
- Idempotency: re-importing with `force: false` MUST NOT create duplicates. Match by slug
using `ObjectService::searchObjects` with `_rbac: false` and `_multitenancy: false`.
Use `version_compare` for skip logic.

### Seed data

Apps that store data in OpenRegister are empty on first install. An empty app cannot be
meaningfully tested — there are no objects to view, search, filter, or interact with.
This blocks both automated browser testing and manual QA. The Loadable Register Template
pattern (see Register templates above) already supports seed data via `components.objects[]`
with the `@self` envelope.

**Requirements:**

- Every app using OpenRegister MUST include 3-5 realistic objects per schema in
`lib/Settings/{app}_register.json`.
- Use `@self` envelope: `{ "@self": { "register": ..., "schema": ..., "slug": ... }, ...properties }`.
Register/schema MUST match keys; slug is unique human-readable identifier for matching.
- Use general organisation data (municipality, consultancy, travel agency, non-profit) —
NOT context-specific. Varied, realistic field values.
- Mock data quality: real Dutch street names, valid postcodes (`[1-9][0-9]{3}[A-Z]{2}`),
correct municipality/KVK codes, BSNs that pass 11-proef. Fictional but distinguishable from real.
- Cross-register consistency: BRP→BAG, KVK→BAG, DSO→BAG references must be valid.
- Loaded on install alongside schemas via same `importFromApp()` pipeline.
- MUST be idempotent — re-importing skips existing objects matched by slug.

**In OpenSpec artifacts:**

- **In design.md**: MUST include a Seed Data section when change introduces/modifies schemas —
define seed objects per schema with concrete field values and related items (files, notes, tasks, contacts).
- **In tasks.md**: MUST include a seed data generation task when change introduces/modifies schemas.

**Exceptions** (no seed data required):

- **nldesign** — has no OpenRegister schemas.
- **ExApp sidecar wrappers** (openklant, opentalk, openzaak, valtimo, n8n-nextcloud) — proxy
external services and do not use OpenRegister.
- **nextcloud-vue** — shared library, no seed data applicable.
- Changes that only modify frontend components or non-schema backend logic (e.g., settings,
permissions) do not require seed data.

**Limitations:** OpenRegister's `ImportHandler` currently supports only flat seed objects.
Related items (files, notes, tasks, contacts) linked through the relation system are tracked
on the product roadmap. Until then, seed data is limited to object properties defined in schemas.

### Deduplication check

- Before proposing new capability: search `openspec/specs/` and `openregister/lib/Service/` for overlap
with ObjectService, RegisterService, SchemaService, ConfigurationService, and shared Vue components.
- If similar capability exists: MUST reference it and explain why new code is needed rather than extending.
- Proposals duplicating existing functionality without justification MUST be rejected.
- **In design.md**: MUST include a "Reuse Analysis" section listing existing OpenRegister services leveraged.
- **In tasks.md**: MUST include a "Deduplication Check" task verifying no overlap — document findings
even if "no overlap found".

### Schema migrations

- Breaking schema changes → new migration in repair step. NEVER modify existing migrations.

### OpenRegister + @conduction/nextcloud-vue — DO NOT REBUILD

The platform provides 258+ backend methods and 69+ frontend components. Apps ONLY build
custom logic for domain-specific business rules. Everything below is provided for FREE.

**CRUD & Data Management** (use ObjectService + CnIndexPage + CnDetailPage):
- Single & bulk create, read, update, delete — `ObjectService.saveObject()`, `deleteObject()`
- List with pagination, sorting, filtering — `ObjectService.findAll()` + `CnDataTable`
- Schema-driven forms — `CnFormDialog` (auto-generates from schema) or `CnAdvancedFormDialog`
- Detail views — `CnDetailPage` with `CnDetailGrid`, `CnDetailCard` sections
- Record merging/deduplication — `ObjectService.mergeObjects()`
- Object locking — `ObjectService.lockObject()` / `unlockObject()`

**Import & Export** (use ImportService/ExportService + CnMassImportDialog/CnMassExportDialog):
- CSV, Excel, JSON import with intelligent field mapping — `ImportService`
- CSV, Excel, JSON export with column selection — `ExportService`
- Bulk import with validation and progress — `CnMassImportDialog`
- Filtered export with format picker — `CnMassExportDialog`
- NO custom import dialogs, parsers, upload handlers, or export controllers

**Search & Discovery** (use IndexService + CnFilterBar + CnFacetSidebar):
- Full-text search with field weighting — `IndexService`
- Faceted navigation with counts — `FacetBuilder` + `CnFacetSidebar`
- Semantic search with embeddings — `VectorizationService`
- Hybrid search (keyword + semantic) — automatic
- Search analytics — `SearchTrailService` (popular terms, activity)
- NO custom search endpoints, query builders, or search pages

**File Management** (use FileService + CnObjectSidebar):
- Upload (single/multipart), download, share links — `FileService`
- File tagging, public/private toggle — `FileService`
- Bulk download as ZIP — `createObjectFilesZip()`
- Text extraction from PDFs/Office docs — `TextExtractionService`
- File tab in object sidebar — `CnObjectSidebar` → `CnFilesTab`
- NO custom file upload components, file controllers, or download handlers

**Audit & Compliance** (use AuditTrailService + CnObjectSidebar):
- Full change tracking with before/after snapshots — automatic
- Audit trail tab — `CnObjectSidebar` → `CnAuditTrailTab`
- GDPR data subject access requests — `inzageverzoek()`, `verwerkingsregister()`
- Audit export and analytics — `AuditTrailController`
- NO custom audit logging, change tracking, or compliance controllers

**Dashboard & Analytics** (use CnDashboardPage + CnChartWidget + CnStatsBlock):
- Drag-drop widget dashboard — `CnDashboardPage` with GridStack
- KPI cards — `CnKpiGrid`, `CnStatsBlock`, `CnStatsPanel`
- Charts (line/bar/pie/donut) — `CnChartWidget` (ApexCharts)
- Data tables as widgets — `CnTableWidget`
- Editable data grids — `CnObjectDataWidget`
- NO custom dashboard layouts, chart components, or KPI cards

**Forms & Dialogs** (use CnFormDialog + schema-driven generation):
- Auto-generated create/edit forms — `CnFormDialog` reads schema → generates fields
- JSON/metadata editing — `CnAdvancedFormDialog` with Properties/Data/Metadata tabs
- Schema editor — `CnSchemaFormDialog`
- Delete/Copy/Mass operations — `CnDeleteDialog`, `CnCopyDialog`, `CnMassDeleteDialog`
- NO custom form components, validation logic, or dialog wrappers

**Navigation & Pagination** (use CnPagination + CnActionsBar + useListView):
- Pagination control with size selector — `CnPagination`
- Action bar (add, search, toggle views) — `CnActionsBar`
- List state management — `useListView` composable (handles search, filter, sort, page)
- Detail state management — `useDetailView` composable
- NO custom pagination logic, debounced search, or list state management

**Authorization & RBAC** (use AuthorizationService + PropertyRbacHandler):
- Role-based access control — `AuthorizationService`
- Field-level permissions — `PropertyRbacHandler`
- Object-level restrictions — `PermissionHandler`
- Authorization audit — `AuthorizationAuditService`
- NO custom permission checks, role systems, or access control middleware

**Webhooks & Events** (use WebhookService):
- Create, test, retry webhooks — `WebhookService`
- CloudEvents format — automatic
- Event subscriptions — selective per schema/action
- NO custom webhook controllers or event dispatchers

**Notifications & Activity** (use NotificationService + ActivityService):
- Nextcloud notifications — `NotificationService`
- Activity feed — `ActivityService`
- Calendar events — `CalendarEventService`
- Deck/Kanban cards — `DeckCardService`

**Store & State** (use createObjectStore + plugins):
- Object stores — `createObjectStore(name)` generates Pinia CRUD store
- Store plugins: `auditTrails`, `files`, `lifecycle`, `relations`, `search`, `selection`
- Column/field/filter generation from schema — `columnsFromSchema()`, `fieldsFromSchema()`
- NO custom Pinia stores for CRUD, Vuex, or manual API call management

**Chat & AI** (use ChatService):
- Multi-turn conversation — `ChatService`
- RAG-based knowledge retrieval — `ContextRetrievalHandler`
- LLM response generation — `ResponseGenerationHandler`

**Data Retention & Archival** (use ArchivalService):
- Legal hold — `LegalHoldService`
- Destruction schedules — `DestructionService`
- Retention policies — `RetentionService`

**Semantic & Hybrid Search** (use SolrController + SettingsController):
- Semantic search via vector embeddings — `SettingsController.semanticSearch()`
- Hybrid search (keyword + semantic combined) — `SolrController.hybridSearch()`
- Vector embedding generation — `VectorizationService`
- NO custom search algorithms — configure via OpenRegister settings

**GraphQL API** (use GraphQLController):
- Query objects across schemas via GraphQL — `GraphQLController.execute()`
- Alternative to REST for complex cross-entity queries

**Organization / Multi-Tenancy** (use OrganisationController):
- Organization CRUD — `OrganisationController`
- Tenant-scoped data isolation — automatic via `TenantLifecycleService`
- NO custom multi-tenancy logic

**Task & Workflow Management** (use TasksController + WorkflowEngineController):
- Task creation and tracking — `TasksController`
- Workflow orchestration — `WorkflowEngineRegistry`
- Scheduled workflows — `ScheduledWorkflowController`
- NO custom task/workflow systems

**Text Extraction** (use FileTextController):
- Extract text from PDFs and Office docs — `TextExtractionService`
- Entity recognition (PII detection) — `EntityRecognitionHandler`
- Content anonymization — automatic

**Timeline & Stages** (use CnTimelineStages):
- Workflow progression visualization — `CnTimelineStages` component
- Stage tracking with status colors

### What apps SHOULD build (custom business logic only):
- External API integrations (SAP, Peppol, TenderNed, etc.)
- PDF/document generation with business-specific templates
- Workflow triggers and business rules specific to the domain
- Notification dispatch with app-specific event types
- Custom settings pages with app-specific configuration
- Background jobs for domain-specific processing
6 changes: 6 additions & 0 deletions .claude/openspec/architecture/adr-002-api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
- URL pattern: `/index.php/apps/{app}/api/{resource}` — lowercase plural, hyphens.
- Methods: GET=read, POST=create, PUT=update, DELETE=remove. No custom methods.
- Pagination: support `_page` + `_limit`. Response includes `total`, `page`, `pages`.
- Errors: appropriate HTTP status + `message` field. NO stack traces in responses.
- Auth: Nextcloud built-in only. NO custom login/session/token flows.
- Public endpoints: annotate `#[PublicPage]` + `#[NoCSRFRequired]`. Register CORS OPTIONS route.
14 changes: 14 additions & 0 deletions .claude/openspec/architecture/adr-003-backend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
- **Controller → Service → Mapper** (strict 3-layer). Controllers NEVER call mappers directly.
- Controllers: thin (<10 lines/method). Routing + validation + response only.
- Services: ALL business logic. Stateless — no instance state between requests.
- Mappers: DB CRUD only. No business logic.
- DI: constructor injection with `private readonly`. NO `\OC::$server` or static locators.
- Entity setters: POSITIONAL args only. `$e->setName('val')` — NEVER `$e->setName(name: 'val')`.
(`__call` passes `['name' => val]` but `setter()` uses `$args[0]`.)
- Routes: `appinfo/routes.php`. Specific routes BEFORE wildcard `{slug}` routes.
- Config: `IAppConfig` with sensitive flag for secrets. NEVER read DB directly.
- Lifecycle: schema init via repair steps (`IRepairStep`), background via job queue, events via dispatcher.
- **Spec traceability**: every class and public method MUST have `@spec` PHPDoc tag(s) linking to
the OpenSpec change that caused it: `@spec openspec/changes/{name}/tasks.md#task-N`.
Multiple `@spec` tags allowed (code touched by multiple changes). File-level `@spec` in header docblock.
This enables: code → docblock → spec traceability alongside code → git blame → commit → issue → spec.
Loading
Loading