Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1667 commits
Select commit Hold shift + click to select a range
c6d6485
feat(decidesk): contract-decision hub — provenance fields, integratio…
rubenvdlinde Jun 14, 2026
6b9f523
Merge pull request 'feat(decidesk): contract-decision & signing hub —…
Jun 14, 2026
222835b
chore(decidesk): archive contract-decision-hub + fix findAll idempote…
rubenvdlinde Jun 14, 2026
f9bf32a
feat(decidesk): citizen-participation schemas — ConsultationReaction …
rubenvdlinde Jun 14, 2026
ed7d751
chore(openspec): archive decidesk-contract-decision-hub
rubenvdlinde Jun 14, 2026
ea28753
feat(decidesk): citizen-participation lifecycle + publication service…
rubenvdlinde Jun 14, 2026
46221d9
feat(decidesk): citizen-participation intake + advisory budget voting…
rubenvdlinde Jun 14, 2026
771cb6f
feat(decidesk): citizen-participation controller + routes + auto-clos…
rubenvdlinde Jun 14, 2026
3555571
test(decidesk): citizen-participation PHPUnit unit tests (29 tests)
rubenvdlinde Jun 14, 2026
a5deb9d
feat(decidesk): citizen-participation frontend — staff+citizen views,…
rubenvdlinde Jun 15, 2026
33673d8
test(decidesk): citizen-participation Playwright e2e + gate-19 @e2e t…
rubenvdlinde Jun 15, 2026
e47e753
fix(decidesk): hydra gate-9 + gate-16 for citizen-participation; upda…
rubenvdlinde Jun 15, 2026
3253017
chore(decidesk): archive citizen-participation change; sync delta int…
rubenvdlinde Jun 15, 2026
f588b0a
feat(decidesk): meeting transcription + AI-assisted draft minutes
rubenvdlinde Jun 15, 2026
07da5c2
chore(decidesk): wire publication deny-list guard, archive change + s…
rubenvdlinde Jun 15, 2026
3ff3314
feat(decidesk): publish decisions/agendas/minutes via OpenCatalogi
rubenvdlinde Jun 15, 2026
b87f389
openspec: archive publish-decisions-via-opencatalogi
rubenvdlinde Jun 15, 2026
9fe6d85
Merge pull request 'chore(decidesk): archive contract-decision-hub + …
Jun 15, 2026
7ddc2b0
Merge remote-tracking branch 'origin/development' into build/citizen-…
Jun 15, 2026
46756ef
Merge pull request 'feat(decidesk): citizen-participation — consultat…
Jun 15, 2026
1be138a
Merge development into meeting-transcription-ai-minutes (union: backg…
Jun 15, 2026
7fa6066
Merge pull request 'feat(decidesk): meeting transcription + AI-assist…
Jun 15, 2026
9920e84
Merge development into publish-decisions-via-opencatalogi
Jun 15, 2026
fe2b253
Merge pull request 'feat(decidesk): publish decisions/agendas/minutes…
Jun 15, 2026
50dc8c1
fix(dashboard): let KPI titles wrap instead of clipping
rubenvdlinde Jun 15, 2026
27ab7e6
docs(openspec): add 1 fleet simplicity proposal(s): decidesk-retire-m…
rubenvdlinde Jun 15, 2026
ceede72
fix(decidesk): retire standalone Motions nav, fold into Decisions filter
rubenvdlinde Jun 15, 2026
3d80652
Merge pull request 'fix(decidesk): retire standalone Motions nav (fol…
Jun 15, 2026
9826166
chore(openspec): archive fleet simplicity changes (decidesk-retire-mo…
rubenvdlinde Jun 15, 2026
4781346
docs(openspec): propose decidesk-decision-events event contract
rubenvdlinde Jun 15, 2026
1cbea1c
feat(decidesk): public DecisionRequested/Concluded event contract cla…
rubenvdlinde Jun 15, 2026
df9a649
feat(decidesk): wire decision event contract to integration + lifecycle
rubenvdlinde Jun 15, 2026
d22a9e4
Merge pull request 'feat(decidesk): event contract for delegated deci…
Jun 15, 2026
c4c361d
feat(publication): RBAC publicatiedatum predicate on PublicationPayload
juanclaude-conduction Jun 15, 2026
6eda248
feat(publication): build anon-publication leg via RBAC publicatiedatum
juanclaude-conduction Jun 15, 2026
b70fd0d
docs+style: re-spec anon-publication to RBAC publicatiedatum; phpcs c…
juanclaude-conduction Jun 15, 2026
670e3b6
Merge pull request 'feat(publication): build anon-publication leg via…
Jun 15, 2026
2bdbf66
feat(ori): expose published PublicationPayloads on the ORI harvest feed
Jun 15, 2026
c7aaa87
test(publication): Newman anon-read contract + OriController harveste…
Jun 15, 2026
ce25fcf
docs(openspec): flip publish-decisions 5.2 + citizen-participation 7.…
Jun 15, 2026
3704497
Merge pull request 'feat(publication): ORI harvest feed + Newman anon…
Jun 15, 2026
5092b11
chore(openspec): archive built decidesk-decision-events
rubenvdlinde Jun 15, 2026
2d461bd
Merge pull request 'chore(openspec): archive built decidesk-decision-…
Jun 15, 2026
b13199b
feat(apphost): decidesk adopts OpenRegister AppHost (observability + …
rubenvdlinde Jun 16, 2026
acbb96a
chore(apphost): archive adopt-apphost change, sync apphost-adoption s…
rubenvdlinde Jun 16, 2026
d34a92f
fix(decidesk): complete ADR-005 decision-supertype refactor
rubenvdlinde Jun 16, 2026
96cdec5
Merge pull request 'Complete decidesk ADR-005 decision-supertype refa…
Jun 16, 2026
739e77d
test(decidesk): fix DecisionLifecycleService unit setup for 7-arg con…
rubenvdlinde Jun 16, 2026
4e270e4
test(decidesk): align QesGuard + QuorumVerification fixtures to super…
rubenvdlinde Jun 16, 2026
54ff8f1
test(decidesk): align search/reporting/reconciliation/export fixtures…
rubenvdlinde Jun 16, 2026
a93bd77
ci(decidesk): unblock phpunit-unit gate — ignore ext-xsl platform req
rubenvdlinde Jun 16, 2026
a08414d
i18n(decidesk): add 3 source strings missing from l10n/en.json
rubenvdlinde Jun 16, 2026
cfe277d
Fix decidesk pre-existing PHP unit baseline to green (#82)
Jun 16, 2026
3efa58c
Merge pull request 'feat(apphost): decidesk adopts OpenRegister AppHo…
Jun 16, 2026
07bb724
feat(notifications): web-push rules — meeting starting, item assigned…
rubenvdlinde Jun 16, 2026
5dd4e84
Merge pull request 'feat(notifications): web-push rules (meeting star…
Jun 16, 2026
3c7006a
docs(features): adopt done-status canon, write real Purpose descripti…
rubenvdlinde Jun 18, 2026
3e51ea9
feat(dashboard): migrate 5 dashboard widgets to abstract widget types
rubenvdlinde Jun 19, 2026
cc8a4f2
chore(dashboard): remove dead bespoke widget components after abstrac…
rubenvdlinde Jun 19, 2026
c78f89d
ci: fix gate runner label codeberg-small -> docker
rubenvdlinde Jun 20, 2026
0848d8f
Merge pull request 'ci(decidesk): fix gate runner label codeberg-smal…
Jun 20, 2026
5f3a99a
docs(features): regenerate features.json (surface done specs with fro…
rubenvdlinde Jun 20, 2026
f6f7b25
ci(decidesk): fix app-tests reusable-workflow dispatch (Failing after…
rubenvdlinde Jun 20, 2026
9362306
ci(decidesk): inline app-tests gates — reusable workflow_call doesn't…
rubenvdlinde Jun 20, 2026
08a1d8d
style(phpcs): drive composer phpcs gate to zero errors
rubenvdlinde Jun 20, 2026
091479c
Merge pull request 'style(phpcs): drive composer phpcs gate to zero e…
Jun 20, 2026
11b5a85
ci(decidesk): replace nonexistent ci-php:8.3/ci-node:20 images with p…
rubenvdlinde Jun 20, 2026
b7df95f
Merge pull request 'ci(decidesk): replace nonexistent ci-php:8.3 imag…
Jun 20, 2026
98ef544
ci(decidesk): run enforced lint+phpcs gate on codeberg-medium + fetch…
Jun 20, 2026
8c6c4fe
fix(specs): quote note fields as folded block scalars (valid YAML fro…
rubenvdlinde Jun 20, 2026
851475b
Merge pull request 'ci(decidesk): finalize lint+phpcs quality gate on…
Jun 20, 2026
c77a834
refactor(settings): adopt CnAdminSettingsShell on the admin page
rubenvdlinde Jun 21, 2026
8ab1a34
chore(deps): @conduction/nextcloud-vue ^1.0.0-beta.123 (CnAdminSettin…
rubenvdlinde Jun 21, 2026
4490329
Merge pull request 'Uniform admin settings via CnAdminSettingsShell +…
Jun 21, 2026
753f83b
chore(deps): @conduction/nextcloud-vue ^1.0.0-beta.125 (highest beta)
rubenvdlinde Jun 22, 2026
a1c34b8
feat(dashboard): per-card date chips, Start-decision-making quick act…
rubenvdlinde Jun 23, 2026
d231f88
openspec: propose consultations & engagement hub (unify participation…
rubenvdlinde Jun 23, 2026
6f4c585
openspec: propose action-items VTODO + Deck-leaf reconciliation
rubenvdlinde Jun 23, 2026
bddd5a0
feat(decidesk): move Start decision-making process into dashboard header
rubenvdlinde Jun 23, 2026
974f79a
docs(build): bump @conduction/docusaurus-preset to ^3.24.0 for self-h…
rubenvdlinde Jun 23, 2026
6def62c
spec(decidesk): resolve consultations-hub + action-items open questions
rubenvdlinde Jun 23, 2026
50b0fb1
feat(decidesk): consultations & engagement hub (consultations-engagem…
rubenvdlinde Jun 23, 2026
6fa4965
chore(decidesk): archive consultations-engagement-hub
rubenvdlinde Jun 23, 2026
8394bc6
Merge pull request 'ci(decidesk): unblock app-tests reusable dispatch…
Jun 23, 2026
b463956
chore(openspec): resurrect 5 undone governance feature proposals into…
rubenvdlinde Jun 23, 2026
9ff0ce2
feat(decidesk): ActionItemWriter — VTODO write path for action items …
rubenvdlinde Jun 23, 2026
4e2ac5f
feat(decidesk): action items as read-only VTODO projection (atomic sw…
rubenvdlinde Jun 23, 2026
3cb3367
Merge pull request 'feat: action items as read-only VTODO projection'…
Jun 23, 2026
053afbc
chore(openspec): archive action-items-vtodo-deck-reconcile
rubenvdlinde Jun 23, 2026
15a9e5c
fix(ci): make app-tests workflow parseable on Forgejo Actions (#90)
Jun 23, 2026
c8ded32
fix(decidesk): repair two pre-existing broken DI registrations
rubenvdlinde Jun 23, 2026
2e0322b
openspec: propose action-item-deck-board + action-item-vtodo-migration
rubenvdlinde Jun 23, 2026
a814a7a
openspec(action-item-deck-board): refine design to real Deck-leaf bridge
rubenvdlinde Jun 23, 2026
a0bf6c9
feat(action-items): project action items onto real Deck cards via the…
rubenvdlinde Jun 23, 2026
72fbc10
Merge pull request 'openspec(action-item-deck-board): refine design t…
Jun 24, 2026
fb7d829
feat(consultations): multi-select type dropdown + reactions table on …
Jun 24, 2026
d12c3c1
Merge pull request 'feat(consultations): multi-select type dropdown +…
Jun 24, 2026
abefdc7
chore(deps): bump @conduction/nextcloud-vue lockfile to 1.0.0-beta.133
Jun 24, 2026
f60a937
ci(forgejo): use short reusable-workflow uses form so Forgejo runs th…
Jun 24, 2026
b6479aa
ci(forgejo): use short reusable-workflow uses form so Forgejo runs th…
Jun 24, 2026
460dc6c
Merge pull request 'chore(deps): bump nextcloud-vue lockfile to beta.…
Jun 24, 2026
328a6d0
feat(dashboard): clickable rows + filter-passing KPI tiles
Jun 24, 2026
9ce2d67
feat(nav): settings foldout via shared buildManifest + bump nc-vue be…
Jun 24, 2026
3eefc1a
Merge pull request 'feat(nav): settings foldout via shared buildManif…
Jun 24, 2026
c8e3e7a
Merge branch 'feat/dashboard-clickable-filters' of https://codeberg.o…
rubenvdlinde Jun 25, 2026
eb3f471
feat(onboarding): add getting-started walkthrough + bump to 0.3.5
rubenvdlinde Jun 25, 2026
c0b4884
chore: rename remaining mydash references to launchpad
rubenvdlinde Jun 25, 2026
4b97dc8
feat(docs): commercial features overlay (honest stable/beta/soon)
rubenvdlinde Jun 25, 2026
1ebcbef
Merge pull request 'decidesk: mark provider-gated voting beta, surfac…
Jun 25, 2026
a3e5cb0
chore(deps): bump @conduction/nextcloud-vue to beta.138 (restart-walk…
rubenvdlinde Jun 26, 2026
3edd95b
chore(deps): bump @conduction/nextcloud-vue to beta.138 (restart-walk…
rubenvdlinde Jun 26, 2026
d494026
feat(integrations): add Besluitvorming decisions integration leaf
rubenvdlinde Jun 26, 2026
179b202
feat(schema): human-friendly titles+descriptions on every property; M…
rubenvdlinde Jun 26, 2026
9c8a5cc
Merge pull request 'feat(schema): human-friendly property titles + Me…
Jun 26, 2026
aa1d84b
fix(phpcs): remove blank line after inline comment in Application::boot
rubenvdlinde Jun 26, 2026
26a0d6b
fix(spec-coverage): add @spec tags to Besluitvorming leaf Vue methods
rubenvdlinde Jun 26, 2026
173d82a
Merge pull request 'feat: Besluitvorming decisions integration leaf' …
Jun 26, 2026
12040c6
chore: bump version to 0.3.9 (#103)
Jun 26, 2026
99462a7
fix(tests): green PHPUnit suite on NC34+PHP8.4
rubenvdlinde Jun 26, 2026
7c42cfc
fix(service): increment consultation submissionCount on reaction appr…
rubenvdlinde Jun 26, 2026
2fecad4
fix(quality): green Psalm + PHPStan + PHPMD on all lib/ files
rubenvdlinde Jun 26, 2026
7c726cc
fix(l10n+deps): add 53 missing translation keys; update twig to 3.27.1
rubenvdlinde Jun 26, 2026
38a9ca7
fix(ci): restore CI-parity for PHPUnit in php:8.3-cli; revert over-ba…
rubenvdlinde Jun 26, 2026
6f37c5f
Merge pull request 'fix: remediate all pre-existing test & quality fa…
Jun 26, 2026
916461c
ci: install nodejs in php:8.3-cli jobs for actions/checkout
rubenvdlinde Jun 27, 2026
8a20177
Merge pull request 'ci: nodejs in php83 jobs' (#105) from ci/node-for…
Jun 27, 2026
f4ab293
ci(phpcs): add missing @spec tags to ActionItemController, ActionItem…
rubenvdlinde Jun 27, 2026
859a0d1
Merge pull request 'ci(decidesk): fix lint/phpcs for quality-gates' (…
Jun 27, 2026
bbb86fc
ci(decidesk): authenticate composer downloads via GH_COMPOSER_TOKEN
rubenvdlinde Jun 29, 2026
7f7a29b
Merge pull request 'ci(decidesk): fix codeload HTTP 400 via GH_COMPOS…
Jun 29, 2026
372d8fd
feat(detail-pages): bespoke purpose-first detail page layouts
rubenvdlinde Jul 2, 2026
4b6c83f
Merge pull request 'Bespoke communication/purpose-first detail pages'…
Jul 2, 2026
1c7f293
feat(schema): add resolver-wired x-schema-org markers
rubenvdlinde Jul 5, 2026
a656960
Merge pull request 'feat(schema): add x-schema-org markers to 10 deci…
Jul 5, 2026
b84fc5a
ci: adopt canonical test workflow (node fix + consolidation)
rubenvdlinde Jul 5, 2026
1c5a278
ci: frontend-coverage job honors app's own --coverage.include (fix js…
rubenvdlinde Jul 6, 2026
3b772c5
feat(app): opt in to the AI-chat companion (:ai-companion="true" on C…
rubenvdlinde Jul 6, 2026
4daebfd
chore: wire check:manifest script (ADR-024, audit item 18)
rubenvdlinde Jul 6, 2026
8e8f25c
Merge pull request 'chore: wire check:manifest script (ADR-024, audit…
Jul 6, 2026
5d7989f
Merge pull request 'feat(app): opt in to the AI-chat companion (aiCom…
Jul 6, 2026
7c51089
feat(portal): portaliq citizen contribution — consultations, votes, b…
rubenvdlinde Jul 7, 2026
3b8e30f
openspec: propose consume-or-rbac-authorization
juanclaude-conduction Jul 7, 2026
801b5cf
openspec: propose info-licence-eupl
juanclaude-conduction Jul 7, 2026
5879ebb
openspec: propose board-self-evaluation
juanclaude-conduction Jul 7, 2026
1b9e8e8
Merge remote-tracking branch 'origin/development' into HEAD
juanclaude-conduction Jul 7, 2026
f68e2d4
feat(info): declare EUPL-1.2 licence in info.xml; fix pre-existing xs…
juanclaude-conduction Jul 7, 2026
087f1e1
feat(board-evaluation): periodic anonymous board self-evaluation
juanclaude-conduction Jul 7, 2026
fbebdf4
refactor(rbac): retire app-local authorization onto OpenRegister RBAC…
juanclaude-conduction Jul 7, 2026
a80b95d
fix(security): authorize ProxyVoteController register/suspend/revoke …
juanclaude-conduction Jul 7, 2026
46b2ba2
perf(audit): resolve previousHash via bounded tail query, not whole-c…
juanclaude-conduction Jul 7, 2026
61788bd
test(security): real-HTTP Newman e2e for proxy-vote/eIDAS/governance-…
juanclaude-conduction Jul 7, 2026
271c2f9
ci(l10n): wire the dead nl parity gate into CI and backfill nl.json t…
juanclaude-conduction Jul 7, 2026
f19a4b7
feat(detail-pages): purposeful per-schema detail page design (widgets…
juanclaude-conduction Jul 7, 2026
6f63b45
fix(detail-pages): audit sidebar tab via built-in widget type (compon…
juanclaude-conduction Jul 7, 2026
2968c54
feat(register): x-relation-filter scoping on relation pickers
juanclaude-conduction Jul 8, 2026
d8513b5
refactor(register): canonical property-level $ref relations, retire x…
juanclaude-conduction Jul 8, 2026
e15bf95
feat(detail-pages): ADR-062 rollout — decidesk field-scoped splits, s…
juanclaude-conduction Jul 8, 2026
3373124
chore(deps): bump @conduction/nextcloud-vue to beta.160 + version bum…
juanclaude-conduction Jul 8, 2026
4f4938b
Merge remote-tracking branch 'origin/development' into development
juanclaude-conduction Jul 8, 2026
f3ab9db
Merge pull request 'feat(detail-pages): ADR-062 rounds 1+2 — dialect …
Jul 8, 2026
ad0865e
fix(build): resolve async chunk URLs from entry script location
juanclaude-conduction Jul 8, 2026
64d501f
chore: 0.3.12 cache-bust after serving-copy repair
juanclaude-conduction Jul 8, 2026
9ee4c1c
Merge pull request 'fix(detail-pages): async chunk URL resolution + 0…
Jul 8, 2026
511b558
fix(consultation-detail): correct reactions KPI filter + remove dupli…
juanclaude-conduction Jul 9, 2026
c750e68
fix(meeting-detail): wire custom-widget slots, add stats-block KPI
juanclaude-conduction Jul 9, 2026
a3fff24
fix(detail-pages): amendment slots gap + card-bottom clipping (rules …
juanclaude-conduction Jul 9, 2026
18438dc
fix(workspace): remove orphaned collaboration-workspace pages, not ti…
juanclaude-conduction Jul 9, 2026
10bd38d
Merge pull request 'fix(detail-pages): slots wiring for custom widget…
Jul 9, 2026
d25bb1f
chore(deps): nc-vue 1.0.0-beta.162 + version bump (visual-audit fix r…
juanclaude-conduction Jul 9, 2026
1fab520
Merge pull request 'decidesk: merge chore/ncvue-beta162-rollout into …
Jul 9, 2026
6e74705
fix(detail-pages): split multi-entry KPI stats-blocks into individual…
juanclaude-conduction Jul 9, 2026
afc94fd
Merge pull request 'ci: adopt canonical test workflow (node fix + con…
Jul 9, 2026
32fb88c
Meeting agenda and action counters as separate tiles (#121)
Jul 9, 2026
b73b70b
sync development
juanclaude-conduction Jul 9, 2026
68cc550
chore: pin @conduction/nextcloud-vue 1.0.0-beta.164
juanclaude-conduction Jul 9, 2026
f376f06
Merge remote-tracking branch 'origin/development' into HEAD
juanclaude-conduction Jul 9, 2026
3b315db
Merge pull request 'decidesk onboarding + dashboard: walkthrough + cl…
Jul 9, 2026
ffd68ab
Meeting tooling refreshed against the latest lib (#122)
Jul 9, 2026
a5c49bd
fix(integrations): make the Besluitvorming decision leaf host-agnosti…
Jul 10, 2026
82f89e0
Governance library pinned to the cross-register foundation build (#124)
Jul 10, 2026
abe574f
docs(openspec): preserve authored-but-uncommitted spec changes (2026-…
juanclaude-conduction Jul 10, 2026
135b467
Merge decidesk-reapply-2026-07-07 (consolidation 2026-07-10)
juanclaude-conduction Jul 10, 2026
f675242
Merge fix/adr062-kpi-split (consolidation 2026-07-10)
juanclaude-conduction Jul 10, 2026
38521a2
Merge specs/authored-2026-07-10 (consolidation 2026-07-10)
juanclaude-conduction Jul 10, 2026
4ba747d
build(deps): upgrade @nextcloud/dialogs to v6 so spawnDialog resolves
juanclaude-conduction Jul 12, 2026
2b67c75
build: add path:false resolve fallback for dialogs v6 FilePicker chunk
juanclaude-conduction Jul 12, 2026
60f4c3a
Merge pull request 'build(deps): upgrade @nextcloud/dialogs to v6 so …
Jul 12, 2026
cd11584
chore(deps): nc-vue beta.190 — restores the scoped component styles
juanclaude-conduction Jul 12, 2026
0f275e8
Merge remote-tracking branch 'origin/development' into HEAD
rubenvdlinde Jul 12, 2026
cd30b13
build: upgrade shared Vue library to beta.190 (scoped CSS regression)…
rubenvdlinde Jul 12, 2026
83f3dca
chore(deps): retarget nc-vue to beta.194
rubenvdlinde Jul 12, 2026
954f8fe
Merge development; keep nc-vue at beta.194
rubenvdlinde Jul 12, 2026
8c716b8
Merge pull request 'decidesk: nc-vue beta.194 (stat/KPI cards render …
Jul 12, 2026
c6efddc
fix(openregister): repair 6 dead ObjectService::findAll() calls + rea…
juanclaude-conduction Jul 13, 2026
37ba3b9
Merge pull request 'fix(decidesk): 6 broken ObjectService::findAll() …
Jul 13, 2026
15da911
docs(openspec): add decidesk-mcp-adoption ff change (ADR-063)
juanclaude-conduction Jul 13, 2026
fd959c4
Merge pull request 'decidesk: ADR-063 MCP adoption spec — 10 of 37 sc…
Jul 13, 2026
eaedf04
fix(security): store decidesk voter_token_secret as sensitive (was cl…
juanclaude-conduction Jul 13, 2026
e513760
fix(security): store voter_token_secret as sensitive (#132)
Jul 13, 2026
16d1cc1
build(deps): update @conduction/nextcloud-vue to ^1.0.0-beta.212
juanclaude-conduction Jul 15, 2026
4599a23
Merge pull request 'fix(live-updates): beta.212 transport fix reaches…
Jul 15, 2026
3095c8f
chore(deps): advance nextcloud-vue lock to beta.213
juanclaude-conduction Jul 16, 2026
e147951
Merge pull request 'chore(deps): advance nextcloud-vue lock to beta.2…
Jul 16, 2026
5787c3a
wip: preserve work (pc reset 2026-07-16) — NOT tested, NOT ready to m…
juanclaude-conduction Jul 16, 2026
04e830d
docs(audit): decidesk seed-mechanism + done-spec audit findings (WIP)
juanclaude-conduction Jul 16, 2026
a5b72cf
fix(spec): repoint broken @spec anchors to canonical specs
rubenvdlinde Jul 16, 2026
ba73c7c
docs(openspec): spec-anchor-repair change (proposal/design/tasks/resi…
rubenvdlinde Jul 16, 2026
17eac8b
Merge pull request 'decidesk: spec-anchor-repair (apply) — 519 anchor…
Jul 16, 2026
f50214c
fix(seeds): plant 21 declarations via x-openregister.seedData + versi…
juanclaude-conduction Jul 16, 2026
6ec185c
docs(openspec): fix-inert-seeds change — proposal, design, tasks, spe…
juanclaude-conduction Jul 16, 2026
c083832
docs(openspec): satisfy strict validator on REQ-SEED-003
juanclaude-conduction Jul 16, 2026
b08373e
chore(openspec): archive spec-anchor-repair change
rubenvdlinde Jul 16, 2026
2818e85
Merge pull request 'decidesk: archive the spec-anchor-repair change' …
Jul 16, 2026
0d62b07
test(seeds): assert seeds at the location that actually plants
juanclaude-conduction Jul 16, 2026
0aa9b23
Merge remote-tracking branch 'origin/development' into fix-inert-seeds
juanclaude-conduction Jul 16, 2026
f15f89a
Merge pull request 'decidesk: fix-inert-seeds (apply)' (#138) from fi…
Jul 16, 2026
69eda13
fix(dialect): un-inert two declarative dialects the engines never read
juanclaude-conduction Jul 16, 2026
942ba20
docs(openspec): done-spec-fixes — audit of 88 done specs, gate-6 trio…
juanclaude-conduction Jul 16, 2026
875259d
Merge pull request 'decidesk: done-spec-fixes (apply)' (#140) from do…
Jul 16, 2026
1b78b0d
docs(openspec): archive fix-inert-seeds + done-spec-fixes; promote sp…
juanclaude-conduction Jul 16, 2026
d03de57
Merge pull request 'decidesk: archive fix-inert-seeds + done-spec-fix…
Jul 16, 2026
db69fb2
docs(audit): decidesk done-spec audit report 2026-07-16
juanclaude-conduction Jul 16, 2026
ded8ab5
Merge pull request 'decidesk: done-spec audit report' (#142) from arc…
Jul 16, 2026
f1e1955
docs(openspec): six market-gap changes from 2026-07-16 Decidesk deep-…
juanclaude-conduction Jul 17, 2026
a772034
Merge remote-tracking branch 'origin/development' into feat/market-ga…
juanclaude-conduction Jul 17, 2026
9157b18
Merge pull request #344 from ConductionNL/feat/market-gap-specs-20260716
rubenvdlinde Jul 17, 2026
0ddbfe8
wip(openspec): wave-2 checkpoint — wave A complete (7 changes), wave …
juanclaude-conduction Jul 17, 2026
dec1f7f
wip(openspec): wave-2 checkpoint — wave B complete (13/19 changes)
juanclaude-conduction Jul 17, 2026
05b10ea
wip(openspec): wave-2 checkpoint — wave C complete (19/19 changes)
juanclaude-conduction Jul 17, 2026
9defeb2
docs(openspec): nineteen market-gap changes — wave 2 of the Decidesk …
juanclaude-conduction Jul 17, 2026
6b1304e
Merge pull request #345 from ConductionNL/feat/market-gap-wave2-20260717
rubenvdlinde Jul 17, 2026
0f996b0
fix(openspec): records-management-archiving consumes OpenRegister's s…
juanclaude-conduction Jul 17, 2026
6bf9db3
Merge pull request #346 from ConductionNL/fix/rma-consume-or-records-…
rubenvdlinde Jul 17, 2026
954c20a
fix(register): Decision schema union types → OR-supported nullable
juanclaude-conduction Jul 18, 2026
2226016
wip(toezeggingen): declarative core (Tasks 1-4) — schemas, seed, page…
juanclaude-conduction Jul 18, 2026
8a1657b
Merge pull request #347 from ConductionNL/fix/decision-schema-union-t…
rubenvdlinde Jul 18, 2026
54b01ca
fix(toezeggingen): KPI filter uses documented in-operator; note OR mu…
juanclaude-conduction Jul 18, 2026
b0055bd
wip(apply): batch-1 declarative cores — 6 changes, 13 schemas
juanclaude-conduction Jul 18, 2026
7a8c44f
fix(delegatie): remove allOf/anyOf composition — OR treats allOf as s…
juanclaude-conduction Jul 18, 2026
bceed39
wip(apply): batch-2 declarative cores — 6 changes, 14 schemas + bodyT…
juanclaude-conduction Jul 18, 2026
a619af2
fix(batch2): remove _note key from authorization blocks (3 schemas)
juanclaude-conduction Jul 18, 2026
64eeb5c
wip(apply): batch-3 declarative cores — 7 changes
juanclaude-conduction Jul 18, 2026
7fdd8bc
fix(batch3): strip unproven x-openregister-relations/-aggregations/-c…
juanclaude-conduction Jul 18, 2026
6696244
Merge pull request #348 from ConductionNL/feat/apply-toezeggingen-ing…
rubenvdlinde Jul 18, 2026
f47da83
fix(test): load OpenRegister stubs via phpunit bootstrap, not compose…
juanclaude-conduction Jul 22, 2026
98d16bf
Merge pull request #349 from ConductionNL/fix/or-stub-autoload-shadow
rubenvdlinde Jul 22, 2026
c5d5263
docs(openspec): add portal-citizen-create-actions ff change
rubenvdlinde Jul 23, 2026
acbf243
Merge pull request #353 from ConductionNL/wip/portal-citizen-create-a…
rubenvdlinde Jul 23, 2026
ca32a5b
feat(portal): citizen create actions — reactions + budget proposals (…
juanclaude-conduction Jul 23, 2026
74985da
Merge pull request #354 from ConductionNL/wip/apply-portal-citizen-cr…
rubenvdlinde Jul 23, 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