feat: apply declarative cores of 20 market-gap changes (register fragments + manifest pages + seed)#348
Merged
rubenvdlinde merged 8 commits intoJul 18, 2026
Conversation
…s, KPI Pilot of the toezeggingen-ingekomen-stukken change: register fragment (both schemas + canonical lifecycle/notification dialects + publication predicate + 7 seed objects), manifest.d fragment (4 pages + menu), and Dashboard KPI widget. Live-validated on 8080: both index pages render seed data, detail page renders, menu + KPI widget present. Known findings (for finish-work, Tasks 5-8 not yet implemented): - Detail relation refs stored as slugs/nil-UUID 404 on resolution (seed refs need resolved UUIDs or relation config adjustment). - Dashboard KPI count shows raw schema total (3), not the filtered overdue count (2) — the declarative stat-widget does not apply the @now relative token / multi-value lifecycle filter (design D6 open question, confirmed live). The D6 fallback must be implemented, not assumed.
…lti-value aggregation limitation Live network trace: the stat-widget count endpoint honors only scalar-equality filters. Bare-array lifecycle is ignored (raw count 3); the documented in operator returns 0. Root cause is OpenRegister's AggregationRunner filter→SQL path (under active change by a parallel session). Kept the correct-intent in-operator form (will read 2 once OR handles multi-value); note documents the limitation + interim options accurately (no false 'verified' claim).
Declarative core (register fragment + manifest.d pages + seed) for: constituency-consultation(48,2), termijnagenda(50,1), raadsinformatiebrieven(51,2), delegatie-mandaatregister(54,1), appointments-and-terms(61,4), interests-and-integrity(62,3). No base-manifest KPI (OR agg multi-value limitation, or#2027), no imperative Tasks 5-8. All fragments openspec-valid + manifest-valid. Conditional-required/ anyOf and per-body notification routing flagged in-file for save-time enforcement.
…chema inheritance
The Bevoegdheidstoedeling schema used allOf:[{anyOf:...},{anyOf:...}] for a
JSON-Schema at-least-one-of validation rule. OpenRegister interprets a schema's
allOf as PARENT-SCHEMA INHERITANCE (SchemaMapper::extractAllOfDelta →
loadSchema(parentRef)), so it passed the anyOf array to loadSchema(string|int)
→ TypeError. Because a TypeError is a \Error (not \Exception), it escaped the
importer's per-schema catch(\Exception) and ABORTED the whole register import
(fragments 48/50/51 landed; 54/61/62 never processed). Removed the composition;
the at-least-one-of rule is save-time enforcement (as the toezeggingen pilot
does). Import now succeeds; all 13 batch-1 schemas land.
…ype enum works-council-consultation(47,1), vragenuur-interpellatie(49,3), pc-cyclus(52,3), verordeningenregister(53,3), governing-documents-register(55,2 + Decision additive citesGoverningDocuments), advisory-opinion-workflow(60,2). All grep-verified zero allOf/anyOf/oneOf + zero union types. Base GovernanceBody.bodyType gains advisory-body/works-council/shared-body (used by advisory + works-council seeds).
OpenRegister's schema authorization block accepts ONLY action keys (create/read/update/delete). Regeling/RegelingVersie/GoverningDocument had a descriptive _note inside authorization → 'Invalid authorization action _note' → those 3 schemas skipped on import (siblings landed). Moved the rationale out; all 14 batch-2 schemas now import. (_note IS allowed in lifecycle/notifications blocks, just not in authorization.)
urgent-decision-procedure(46: Decision/Meeting/ProcessTemplate additive deltas), shared-governance-bodies(56: 3 new + Membership.namens delta), vve-alv-pack(57: 4), woo-diwoo-publication(58: 2), member-onboarding(59: 2), member-proxy-authorization(63: ProxyAuthorization + Vote/ProcessTemplate deltas), embargo-geheimhouding(65: 2). All grep-verified zero allOf/anyOf/oneOf, zero _note-in-authorization, zero union types; additive deltas are add-only + version- bumped. inspreekrecht-plenair deferred (depends on unlanded commissievergaderingen).
…alculations dialects These dialects appear in NO landed decidesk fragment and are the imperative- materialised behaviours the designs place OUTSIDE the declarative core. Removed from urgency-policy (Decision aggregations+calculations), shared-governance-bodies (3 relations blocks), embargo-geheimhouding (aggregations) to match the proven lifecycle+notifications+authorization+$ref pattern. (NOTE: the batch-3 import is separately blocked by an OpenRegister runtime breakage — SystemEntityObjectAdapter constructor — from a concurrent session; verified by the identical batch1+2 config also failing now though it imported cleanly earlier.)
rubenvdlinde
requested review from
SudoThijn,
WilcoLouwerse,
bbrands02,
remko48 and
rjzondervan
as code owners
July 18, 2026 12:34
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Applies the declarative cores (register schemas + seed data + manifest-v2 pages) of 20 of the 25 market-gap changes from the 2026-07-16/17 Decidesk deep-dive, plus the register fixes they surfaced. All fragments are
openspec validate-clean and Ajv-clean; 13 were live-imported and UI-validated on 8080 (schemas + seed data render, ~20 new menu entries, 0 console errors).This is the declarative core only — the imperative Tasks 5–8 (PHP services, controllers, routes, e2e) of each change remain follow-ups, as do 5 changes not yet applied (inspreekrecht-plenair, which depends on the unlanded commissievergaderingen change, and the 4 external-dependency changes: records-management/openregister, meeting-pack/docudesk, document-annotations/pdfjs, document-accessibility/PDF-parser).
What's included
Register fixes (real bugs / OR-import compatibility):
nullable(the schema failed every import; also landed standalone as fix(register): Decision schema union types → OR-supported nullable (Decision couldn't re-import) #347).allOf/anyOfremoved from delegatie — OR treats a schema'sallOfas parent inheritance → TypeError that aborts the whole import._noteremoved fromauthorizationblocks (3 schemas) — OR'sauthorizationaccepts onlycreate/read/update/delete.x-openregister-relations/-aggregations/-calculationsremoved from 3 batch-3 fragments — these are the imperative-materialised tail, not declarative-core, and abort the import.GovernanceBody.bodyTypegainsadvisory-body/works-council/shared-body.Applied cores (register.d fragments 45–65 + src/manifest.d/ + seed):*
Decision.citesGoverningDocuments), advisory-opinion-workflow.Membership.namens), vve-alv-pack, woo-diwoo-publication, member-onboarding, member-proxy-authorization (+Vote/ProcessTemplatedeltas), embargo-geheimhouding. Fragments are on disk and will import on the first successful run once OR recovers.Additive deltas to existing schemas are add-only + version-bumped (deep-merge unions them; verified the merged
Decisionkeeps all 43 original properties + the new ones).Known follow-ups (tracked)
@ref:seed tokens as a follow-up).🤖 Generated with Claude Code