Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1148 commits
Select commit Hold shift + click to select a range
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
43e2156
docs: fill journeydoc tutorial content + capture spec + screenshots (…
rubenvdlinde May 13, 2026
c5ee8d0
feat(manifest): render task-status / access-level / meeting-mode colu…
rubenvdlinde May 13, 2026
6ad859b
chore: regenerate package-lock.json (npm ci was failing — lock out of…
rubenvdlinde May 13, 2026
37e2719
Merge pull request #197 from ConductionNL/feat/index-status-badges
rubenvdlinde May 13, 2026
efbadf5
chore(deps): bump @conduction/nextcloud-vue to ^1.0.0-beta.42
rubenvdlinde May 13, 2026
31a492b
Merge pull request #198 from ConductionNL/feat/link-widgets-and-beta42
rubenvdlinde May 13, 2026
b33b8a4
fix(settings): pass JSON data and version to OR ConfigurationService:…
rubenvdlinde May 13, 2026
be30eb1
chore(docs): refresh tutorial screenshots with seeded data (#200)
rubenvdlinde May 13, 2026
9dda686
ci(docs): revert deploy source to documentation branch (docs CI separ…
rubenvdlinde May 13, 2026
835fb92
feat(integrations): wire the 18 leaf integrations from @conduction/ne…
rubenvdlinde May 15, 2026
360d5c3
fix(boot): setActivePinia(pinia) before initializeStores() runs
rubenvdlinde May 15, 2026
e50ef83
chore(deps): bump @conduction/nextcloud-vue to ^1.0.0-beta.44
rubenvdlinde May 15, 2026
a1db82e
test(integrations): Playwright UI smoke for the registry chain end-to…
rubenvdlinde May 15, 2026
4ced4c9
fix(lint): split multi-attribute opening tag in LiveMeeting.vue (vue/…
rubenvdlinde May 15, 2026
20af0d0
Merge pull request #205 from ConductionNL/feat/integration-leaves-fle…
rubenvdlinde May 15, 2026
9219c53
chore(security): require 24h cooldown on npm packages (#206)
rubenvdlinde May 17, 2026
da41b4c
feat(docs): wire AI-crawler baseline (preset 3.4.0 + validator + llms…
rubenvdlinde May 18, 2026
6619d23
feat(docs): per-app OG card + accurate llms.txt links (#212)
rubenvdlinde May 18, 2026
1b064c9
chore(docs): use validator bin from preset 3.5.0 (#213)
rubenvdlinde May 18, 2026
e5cdaef
chore(docs): bump preset to ^3.6.0 + sync lockfile (#214)
rubenvdlinde May 18, 2026
c77b388
chore(deps): upgrade preset lockfile to 3.6.1 (unbreaks deploy) (#216)
rubenvdlinde May 18, 2026
47cbcb1
chore(deps): preset lockfile 3.6.1 -> 3.6.2 (validator patch) (#218)
rubenvdlinde May 18, 2026
eeb5aac
chore(deps): preset lockfile 3.6.2 -> 3.7.0 (sitemap lastmod auto-app…
rubenvdlinde May 19, 2026
a0bb88f
chore(deps): preset lockfile 3.7.0 -> 3.7.1 (relaxed lastmod threshol…
rubenvdlinde May 19, 2026
baf42ad
chore(dependabot): retarget npm updates to development (main is prote…
rubenvdlinde May 19, 2026
9f65e46
chore(brand): drop hard-coded DetailHero status + version (preset aut…
rubenvdlinde May 19, 2026
b9ce06c
chore(brand): align app-store hex to canonical cobalt #21468B (#203)
rubenvdlinde May 19, 2026
90e0194
chore: remove dead custom Vue components (AmendmentList, GlobalSearch…
rubenvdlinde May 19, 2026
af2a2a5
fix(live-meeting): bind LiveMeeting to shared store cache for live re…
rubenvdlinde May 19, 2026
30b1922
chore(openspec): Chain meeting/docs/analytics specs to openregister i…
rubenvdlinde May 19, 2026
853c6a6
chore(deps): preset lockfile 3.7.1 -> 3.8.0 (BreadcrumbList + TechArt…
rubenvdlinde May 19, 2026
bff7f80
chore(deps): preset lockfile 3.8.0 -> 3.9.0 (TechArticle gate) (#227)
rubenvdlinde May 19, 2026
1af65f2
fix(docs): descriptive homepage title (closes ConductionNL/.github#80)
rubenvdlinde May 19, 2026
6387570
Merge pull request #229 from ConductionNL/seo/title-fix-80
rubenvdlinde May 19, 2026
69f94c8
fix(docs): hand-written meta descriptions on homepage + intro (#81)
rubenvdlinde May 19, 2026
6863388
Merge pull request #231 from ConductionNL/seo/meta-descriptions-81
rubenvdlinde May 19, 2026
e5277c2
chore(docs): bump @conduction/docusaurus-preset to 3.10.0 (#79)
rubenvdlinde May 19, 2026
da4680f
Merge pull request #233 from ConductionNL/chore/preset-3.10.0
rubenvdlinde May 19, 2026
373a227
fix(boot): drop missing registerXwikiIntegration import + bump nc-vue…
rubenvdlinde May 20, 2026
f9e1e19
chore(docs): bump @conduction/docusaurus-preset to ^3.12.0
rubenvdlinde May 20, 2026
cf84e00
feat(manifest-v2): convert MeetingIntegrations custom → detail (refs …
rubenvdlinde May 20, 2026
36b3f1d
adr: push 8 architecture decisions from Specter
May 20, 2026
31e7c13
feat: Add OpenSpec change mcp-tools from Specter
May 20, 2026
9a7fea9
feat: Add OpenSpec change mcp-tools from Specter
May 20, 2026
ead7008
chore: add hydra.json for mcp-tools
May 20, 2026
44ac82c
chore: link issue to hydra.json for mcp-tools
May 20, 2026
be7d79a
feat(manifest-v2): flip FeaturesRoadmap to type:"roadmap", drop wrapp…
rubenvdlinde May 20, 2026
64932fc
chore(deps): bump @conduction/nextcloud-vue to ^1.0.0-beta.66 (#241)
rubenvdlinde May 21, 2026
e02af40
chore: sync canonical root configs + mechanical phpmd cleanup (#243)
rubenvdlinde May 21, 2026
8d4f032
feat: Add OpenSpec change board-meeting-resolutions from Specter
May 22, 2026
155d38b
feat: Add OpenSpec change board-meeting-resolutions from Specter
May 22, 2026
3eac59e
chore: add hydra.json for board-meeting-resolutions
May 22, 2026
d0b5422
chore: link issue to hydra.json for board-meeting-resolutions
May 22, 2026
1c40898
chore(deps): bump PHP requirement to ^8.3 (#251)
rubenvdlinde May 22, 2026
b1af8e6
docs(openspec): IA alignment refactor proposal for Decidesk (#252)
rubenvdlinde May 23, 2026
e33652d
docs(architecture): add ADR-004 information architecture (#253)
rubenvdlinde May 23, 2026
97180b6
chore(deps): bump composer config.platform.php to 8.3 (#254)
rubenvdlinde May 23, 2026
d8762cb
chore(info.xml): canonicalize PHP min, NC version range, licence spel…
rubenvdlinde May 23, 2026
ad819bf
chore(openspec): dedupe stutter-prefixed ADR files (#256)
rubenvdlinde May 23, 2026
d88efa6
chore(adr): merge forked content + delete 7 stale stutter ADR files (…
rubenvdlinde May 23, 2026
5ee3dc8
chore(openspec): bring 13 baseline specs forward from beta branch (#259)
rubenvdlinde May 24, 2026
2c2191f
docs: port Decidesk product strategy docs forward from beta (b10823b8…
rubenvdlinde May 24, 2026
1e8ee54
chore(quorum-chain-3): delete QuorumService (now obsolete) (#164)
rubenvdlinde May 25, 2026
56d25d9
retrofit: annotate frontend @spec coverage to zero (153 methods) (#263)
rubenvdlinde May 25, 2026
e7782ed
chore(nav): adopt three-section nav model + bump nc-vue to beta.97 (#…
rubenvdlinde May 25, 2026
9118afd
feat(nav): add Features & roadmap page + bump nc-vue beta.101 (#265)
rubenvdlinde May 25, 2026
66e2843
feat(preferences): generic per-user preferences endpoint (#266)
rubenvdlinde May 25, 2026
b144b19
retrofit: spec-cover preferences API (REQ-PREF-001/002) (#268)
rubenvdlinde May 25, 2026
63918e2
chore(openspec): leaf-migration specs for p4-collaboration services (…
rubenvdlinde May 25, 2026
e198f8d
Merge pull request #269 from ConductionNL/chore/leaf-migration-specs
rubenvdlinde May 25, 2026
2da3842
[change request] decidesk notifications (#267)
rubenvdlinde May 25, 2026
8853455
chore(composer): bump lock platform-overrides to PHP 8.3 to match con…
rubenvdlinde May 25, 2026
c350971
chore(composer): bump dev deps twig/twig + symfony/yaml to patched ve…
rubenvdlinde May 26, 2026
5373569
feat(openspec): IA-alignment change, coverage report, integration-reg…
rubenvdlinde May 26, 2026
6dceb53
Merge remote-tracking branch 'origin/development' into chore/bump-doc…
rubenvdlinde May 26, 2026
b628af4
fix(ci): resolve phpcs alignment/line-length and add docs/features.json
rubenvdlinde May 26, 2026
03b8000
Merge pull request #278 from ConductionNL/chore/bump-docusaurus-prese…
rubenvdlinde May 26, 2026
a977abc
fix(settings): use IInitialState/loadState for app version (hydra gat…
rubenvdlinde May 26, 2026
3aa1b63
fix(security): clear Bucket-B (ADR-023 + auth/routing) (#290)
rubenvdlinde May 26, 2026
79472b2
chore: add publiccode.yml (Standard for Public Code compliance) (#291)
rubenvdlinde May 26, 2026
49a9435
refactor(ADR-022): remove redundant MeetingController/MeetingService …
rubenvdlinde May 26, 2026
cbb6451
refactor: migrate deprecated IConfig app-values to IAppConfig (#293)
rubenvdlinde May 26, 2026
021505b
test(e2e): gate-19 spec-coverage — 0 uncovered scenarios
rubenvdlinde May 27, 2026
9219874
Merge pull request #294 from ConductionNL/test/e2e-coverage-gate19
rubenvdlinde May 27, 2026
6673364
fix: update SettingsControllerTest to match refactored controller and…
rubenvdlinde May 27, 2026
7887bce
Merge pull request #295 from ConductionNL/fix/phpunit-settingscontrol…
rubenvdlinde May 27, 2026
90666a5
fix: correct OR ObjectService API, add schema fields, sign mail votes…
rubenvdlinde May 27, 2026
983f73d
fix(security): prevent IDOR on delegation, workspace, comment, and ta…
rubenvdlinde May 27, 2026
ecda152
fix(security): enforce server-side identity on comment author and eng…
rubenvdlinde May 27, 2026
0fc3680
fix(security): scope MCP tool results to caller's meetings, use nextc…
rubenvdlinde May 27, 2026
d9ee65f
fix(security): quorum fail-closed, chair/secretary access to minutes/…
rubenvdlinde May 27, 2026
672109f
fix(deps): point @conduction/nextcloud-vue to pre-built beta.108 (git…
rubenvdlinde May 27, 2026
fdf7b60
Merge pull request #329 from ConductionNL/fix/nc-vue-beta108-table
rubenvdlinde May 27, 2026
e466df0
fix(security): membership authz, tally bounds, public-state filtering…
rubenvdlinde May 27, 2026
655126c
fix(ori): surface closeVotingRound failures explicitly and add bearer…
rubenvdlinde May 27, 2026
dc6aff3
feat(adr-036): migrate App.vue to v2 kind-tagged registry prop
rubenvdlinde May 27, 2026
25d0d59
Merge pull request #332 from ConductionNL/feat/adr-036-registry-prop
rubenvdlinde May 27, 2026
8d11da2
fix(security): introduce ParticipantResolver — replace five non-exist…
rubenvdlinde May 28, 2026
cd9ede5
fix(security): IDOR family + OR-API drift (C1/C4/H3) (#336)
rubenvdlinde May 28, 2026
8e8f6df
fix(security): disable email-voting + ORI email leak + @self.id expos…
rubenvdlinde May 28, 2026
eb4fad9
fix(cleanup): admin delegation bypass, ORI lifecycle gate, dead try/c…
rubenvdlinde May 28, 2026
a8e9ac5
fix(security): bump twig/twig to v3.27.0 to resolve 5 sandbox-bypass …
rubenvdlinde May 28, 2026
82c3d0f
Merge pull request #340 from ConductionNL/fix/twig-cve-3-27
rubenvdlinde May 28, 2026
2b9c8b2
fix(security): wave-3 critical C1-C5 fixes — OR filter contract + sta…
rubenvdlinde May 28, 2026
869f16d
test: fix pre-existing test failures after constructor and logic updates
rubenvdlinde May 28, 2026
6c22270
fix: make composer check:strict pass on development
rubenvdlinde May 28, 2026
90915d3
Merge pull request #342 from ConductionNL/fix/strict-phpcs-phpunit-st…
rubenvdlinde May 28, 2026
3985dc1
chore(openspec): roll back 7 empty scaffold change dirs (#339)
rubenvdlinde May 28, 2026
9a4df21
fix: harden auth guards on agenda/motion/voting endpoints
rubenvdlinde May 28, 2026
7f90061
Merge pull request #343 from ConductionNL/fix/agenda-auth-and-route-o…
rubenvdlinde May 28, 2026
0f8cbda
fix(security): wave-7 critical C1-C2 (analytics DI key + UUID vs UID …
rubenvdlinde May 28, 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